Kodokon kodokon.com

Fehler und Ausnahmen: try, except, raise

Fange vorhersehbare Fehler mit try/except/else/finally ab und wirf deine eigenen Ausnahmen, um ungültige Daten zu signalisieren.

9 Min. · 3 Fragen

Diese Lektion in Kodokon öffnen

Ein echtes Programm scheitert: fehlende Datei, ungültige Eingabe, abgebrochene Netzwerkverbindung. Python signalisiert diese Situationen mit Ausnahmen, die die Ausführung unterbrechen und den Aufrufstapel hochwandern, bis ein try/except sie abfängt. Der professionelle Reflex: Fange die spezifischste mögliche Ausnahme ab, so nah wie möglich an der Stelle, an der du weißt, was zu tun ist.

PYTHON
def parse_age(text):
    try:
        return int(text)
    except ValueError:
        return None

print(parse_age("34"))      # 34
print(parse_age("thirty"))  # None
Wir fangen genau ValueError ab, nicht jeden Fehler.

Der vollständige Block hat vier Zweige. try enthält den riskanten Code, except behandelt den Fehler, else läuft nur, wenn keine Ausnahme geworfen wurde, und finally läuft in jedem Fall - ideal, um eine Ressource freizugeben oder zu protokollieren. Der Sinn von else: Halte das try minimal, damit du auf einen Blick siehst, welche Zeile fehlschlagen kann.

PYTHON
values = ["10", "abc", "25"]
total = 0

for value in values:
    try:
        number = int(value)
    except ValueError:
        print(f"Skip : {value}")
    else:
        total += number
    finally:
        print(f"Process : {value}")

print(total)  # 35
else läuft nur, wenn es keinen Fehler gibt; finally läuft immer.

Deine Funktionen können auch ihre eigenen Ausnahmen mit raise werfen, sobald ein empfangenes Datum ungültig ist: Es ist besser, sofort mit einer klaren Meldung zu scheitern, als ein falsches Ergebnis zu erzeugen. Definiere eine eigene Klasse, die von Exception erbt: Der Aufrufer kann sie dann gezielt abfangen, ohne versehentlich andere Fehler abzufangen.

PYTHON
class EmptyCartError(Exception):
    pass

def checkout(items):
    if not items:
        raise EmptyCartError("Empty cart.")
    return round(sum(items), 2)

try:
    print(checkout([]))
except EmptyCartError as error:
    print(f"Error : {error}")
Eine eigene fachliche Ausnahme macht den Fehler explizit und gezielt.

Wissenscheck

Stelle sicher, dass du die wichtigsten Punkte dieser Lektion behalten hast.

  1. Wann läuft der else-Block eines try/except?
    • Nur, wenn im try keine Ausnahme geworfen wurde
    • Nur, wenn eine Ausnahme abgefangen wurde
    • In jedem Fall, nach dem try
  2. In welchen Fällen läuft der finally-Block?
    • Nur, wenn eine Ausnahme geworfen wurde
    • Nur, wenn keine Ausnahme geworfen wurde
    • In jedem Fall, ob mit oder ohne Ausnahme
  3. Warum sollte man ein nacktes except: vermeiden, das alles abfängt?
    • Es verbirgt echte Fehler und macht das Debuggen sehr schwierig
    • Es ist langsamer als ein gezieltes except
    • Es funktioniert nur mit Ausnahmen der Standardbibliothek