Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Fehlerbehandlung im Asynchronen Code | Asynchronous Programming
Python Fortgeschrittene Konzepte

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.

question mark

Wie können Ausnahmen in asynchronen Coroutinen richtig behandelt werden, um unbehandelte Fehler zu vermeiden?

Wählen Sie alle richtigen Antworten aus

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 4. Kapitel 5

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Abschnitt 4. Kapitel 5
some-alt