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.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår