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

Feilhåndtering i asynkron kode

Sveip for å vise menyen

Når du arbeider med asynkron kode i Python ved bruk av asyncio, krever håndtering av feil nøye oppmerksomhet fordi unntak kan forplante seg annerledes sammenlignet med synkron kode. I en synkron kontekst bruker du ofte en try-except-blokk for å fange opp unntak rundt kode som kan feile. Denne samme strukturen fungerer inne i korutiner, men det er flere hensyn å ta når du arbeider med oppgaver som er planlagt av asyncio.

Hvis et unntak oppstår inne i en async def-korutine og ikke fanges opp, vil det forplante seg til punktet hvor korutinen blir avventet. Hvis du bruker await på en korutine som kaster et unntak, vil unntaket bli kastet på await-stedet, slik at du kan fange det med en try-except-blokk. Men hvis du planlegger en korutine som en oppgave ved å bruke asyncio.create_task() eller asyncio.ensure_future(), forplanter ikke unntaket seg umiddelbart. I stedet lagres det i oppgaveobjektet og vil bare bli kastet når du eksplisitt avventer oppgaven eller sjekker resultatet.

Dette betyr at hvis du ikke håndterer unntak inne i korutinen eller når du avventer oppgaven, kan du gå glipp av kritiske feil, eller unntakene kan bli logget av hendelsessløyfen som "uhåndterte unntak." For å unngå dette bør du håndtere unntak enten inne i korutinen ved hjelp av try-except, eller sørge for at du avventer alle oppgaver og håndterer resultatene deres riktig. Denne tilnærmingen bidrar til at asynkrone programmer forblir stabile og gjør feilsøking enklere.

Her er et Python-eksempel som viser hvordan du håndterer unntak inne i en asynkron korutine ved bruk av en try-except-blokk:

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 utdata:

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

Dette kodeeksempelet definerer en asynkron korutine may_fail som bruker en try-except-blokk for å fange opp ValueError-unntak når et partall behandles. Hvis n er et partall, kastes en ValueError og fanges opp inne i korutinen, og en melding skrives ut. Korutinen main planlegger tre oppgaver ved å bruke asyncio.create_task() og samler dem med asyncio.gather(), slik at alle oppgaver blir avventet. Denne oppsettet sikrer at unntak som oppstår i korutinene håndteres på en kontrollert måte, og at ingen uhåndterte unntak blir liggende igjen i hendelsessløyfen.

question mark

Hvordan kan du håndtere unntak i asynkrone koroutiner på en korrekt måte for å unngå ubehandlede feil?

Velg alle riktige svar

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 4. Kapittel 5

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Seksjon 4. Kapittel 5
some-alt