Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Fejlhåndtering i asynkron kode | Asynchronous Programming
Python Strukturel Programmering

Fejlhåndtering i asynkron kode

Stryg for at vise menuen

Ved arbejde med asynkron kode i Python ved hjælp af asyncio kræver fejlhåndtering særlig opmærksomhed, da undtagelser kan udbrede sig anderledes end i synkron kode. I en synkron kontekst bruges ofte et try-except-blok til at opfange undtagelser omkring kode, der kan fejle. Denne struktur fungerer også inde i korutiner, men der er yderligere overvejelser, når man arbejder med opgaver, der planlægges af asyncio.

Hvis en undtagelse opstår inde i en async def-korutine og ikke opfanges, vil den udbrede sig til det punkt, hvor korutinen afventes. Hvis du bruger await på en korutine, der udløser en undtagelse, vil undtagelsen blive udløst på await-stedet, hvilket gør det muligt at opfange den med en try-except-blok. Hvis du derimod planlægger en korutine som en opgave med asyncio.create_task() eller asyncio.ensure_future(), udbredes undtagelsen ikke straks. I stedet gemmes den i opgaveobjektet og vil kun blive udløst, når du eksplicit afventer opgaven eller tjekker dens resultat.

Dette betyder, at hvis du ikke håndterer undtagelser inde i korutinen eller ved afventning af opgaven, kan du overse kritiske fejl, eller undtagelserne kan blive logget af event loopet som "uhåndterede undtagelser." For at undgå dette bør du håndtere undtagelser enten inden for korutinen ved hjælp af try-except, eller sikre at du afventer alle opgaver og håndterer deres resultater korrekt. Denne tilgang hjælper dine asynkrone programmer med at forblive stabile og gør fejlfinding lettere.

Her er et Python-kodeeksempel, der demonstrerer, hvordan man håndterer undtagelser inde i en asynkron korutine ved hjælp af en try-except-blok:

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())

Forventet output:

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

Dette kodeeksempel definerer en asynkron korutine may_fail, der bruger en try-except-blok til at opfange ValueError-undtagelser, når et lige tal behandles. Hvis n er lige, udløses en ValueError, som opfanges inden for korutinen, og der udskrives en besked. Korutinen main planlægger tre opgaver med asyncio.create_task() og samler dem med asyncio.gather(), hvilket sikrer, at alle opgaver afventes. Denne opsætning sikrer, at undtagelser, der opstår i korutinerne, håndteres korrekt, og at der ikke efterlades uhåndterede undtagelser i event loopet.

question mark

Hvordan kan du korrekt håndtere undtagelser i asynkrone koroutiner for at undgå ubehandlede fejl?

Vælg alle korrekte svar

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 4. Kapitel 5

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Sektion 4. Kapitel 5
some-alt