Fehlerbehandlung im Asynchronen Code
Swipe um das Menü anzuzeigen
Beim Arbeiten mit asynchronem Code in Python unter Verwendung von asyncio erfordert die Fehlerbehandlung besondere Aufmerksamkeit, da Ausnahmen sich anders ausbreiten können als im synchronen Code. In einem synchronen Kontext wird häufig ein try-except-Block verwendet, um Ausnahmen um Code zu fangen, der fehlschlagen könnte. Diese Struktur funktioniert auch innerhalb von Koroutinen, jedoch gibt es zusätzliche Aspekte zu beachten, wenn Aufgaben mit asyncio geplant werden.
Wird in einer async def-Koroutine eine Ausnahme ausgelöst und nicht abgefangen, breitet sie sich bis zu dem Punkt aus, an dem die Koroutine erwartet wird. Wenn Sie await für eine Koroutine verwenden, die eine Ausnahme auslöst, wird die Ausnahme an der Await-Stelle ausgelöst, sodass Sie sie mit einem try-except-Block abfangen können. Wenn Sie jedoch eine Koroutine als Aufgabe mit asyncio.create_task() oder asyncio.ensure_future() planen, wird die Ausnahme nicht sofort weitergegeben. Stattdessen wird sie im Aufgabenobjekt gespeichert und erst ausgelöst, wenn Sie die Aufgabe explizit erwarten oder ihr Ergebnis abfragen.
Das bedeutet, dass Sie kritische Fehler übersehen könnten oder Ausnahmen vom Event-Loop als "unbehandelte Ausnahmen" protokolliert werden, wenn Sie Ausnahmen weder innerhalb der Koroutine noch beim Awaiten der Aufgabe behandeln. Um dies zu vermeiden, sollten Sie Ausnahmen entweder innerhalb der Koroutine mit try-except behandeln oder sicherstellen, dass Sie alle Aufgaben erwarten und deren Ergebnisse korrekt verarbeiten. Dieser Ansatz trägt zur Stabilität Ihrer asynchronen Programme bei und erleichtert das Debugging.
Hier ist ein Python-Codebeispiel, das zeigt, wie Ausnahmen innerhalb einer asynchronen Koroutine mit einem try-except-Block behandelt werden:
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())
Erwartete Ausgabe:
Caught exception in coroutine: Even number error: 0
Processed: 1
Caught exception in coroutine: Even number error: 2
Dieses Codebeispiel definiert eine asynchrone Koroutine may_fail, die einen try-except-Block verwendet, um ValueError-Ausnahmen beim Verarbeiten einer geraden Zahl abzufangen. Ist n gerade, wird eine ValueError ausgelöst und innerhalb der Koroutine abgefangen, wobei eine Meldung ausgegeben wird. Die Koroutine main plant drei Aufgaben mit asyncio.create_task() und sammelt sie mit asyncio.gather(), sodass alle Aufgaben erwartet werden. Diese Struktur stellt sicher, dass Ausnahmen in den Koroutinen ordnungsgemäß behandelt werden und keine unbehandelten Ausnahmen im Event-Loop verbleiben.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen