Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Felhantering i asynkron kod | Asynchronous Programming
Python Strukturell Programmering

Felhantering i asynkron kod

Svep för att visa menyn

Vid arbete med asynkron kod i Python med asyncio krävs noggrann hantering av fel eftersom undantag kan spridas på ett annat sätt jämfört med synkron kod. I ett synkront sammanhang används ofta ett try-except-block för att fånga undantag kring kod som kan misslyckas. Denna struktur fungerar även inuti koroutiner, men det finns ytterligare aspekter att beakta när det gäller uppgifter som schemaläggs av asyncio.

Om ett undantag uppstår inuti en async def-korutin och inte fångas, kommer det att spridas upp till den punkt där korutinen inväntas. Om du använder await på en korutin som kastar ett undantag, kommer undantaget att kastas vid await-anropet, vilket gör det möjligt att fånga det med ett try-except-block. Om du däremot schemalägger en korutin som en uppgift med asyncio.create_task() eller asyncio.ensure_future(), sprids inte undantaget omedelbart. Istället lagras det i uppgiftsobjektet och kommer endast att kastas när du uttryckligen inväntar uppgiften eller kontrollerar dess resultat.

Detta innebär att om du inte hanterar undantag inuti korutinen eller när du inväntar uppgiften, kan du missa kritiska fel, eller så kan undantagen loggas av händelseloopen som "ohanterade undantag". För att undvika detta bör du hantera undantag antingen inom korutinen med try-except, eller säkerställa att du inväntar alla uppgifter och hanterar deras resultat korrekt. Detta tillvägagångssätt bidrar till att hålla dina asynkrona program stabila och gör felsökning enklare.

Här är ett Python-exempel som visar hur undantag hanteras inuti en asynkron korutin med ett try-except-block:

import asyncio

async def may_fail(n):
    try:
        if n % 2 == 0:
            raise ValueError(f"Even number error: {n}")
        print(f"Processed: {n}")
    except ValueError as e:
        print(f"Caught exception in coroutine: {e}")

async def main():
    tasks = [asyncio.create_task(may_fail(i)) for i in range(3)]
    await asyncio.gather(*tasks)

asyncio.run(main())

Förväntad utdata:

Caught exception in coroutine: Even number error: 0
Processed: 1
Caught exception in coroutine: Even number error: 2

Detta kodexempel definierar en asynkron korutin may_fail som använder ett try-except-block för att fånga ValueError-undantag när ett jämnt tal behandlas. Om n är jämnt kastas ett ValueError och fångas inom korutinen, vilket skriver ut ett meddelande. Korutinen main schemalägger tre uppgifter med asyncio.create_task() och samlar dem med asyncio.gather(), vilket säkerställer att alla uppgifter inväntas. Denna struktur gör att undantag som uppstår i korutinerna hanteras på ett kontrollerat sätt och att inga ohanterade undantag lämnas i händelseloopen.

question mark

Hur kan du hantera undantag i asynkrona koroutiner på rätt sätt för att undvika ohanterade fel?

Välj alla rätta svar

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 4. Kapitel 5

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Avsnitt 4. Kapitel 5
some-alt