0%

Fehler, Validierung und Fehlersuche · Übung

Fange eine bestimmte Ausnahme ab

Angenommen, jemand gibt six ein, obwohl dein Programm eine Anzahl braucht. Du weißt bereits, dass int("six") einen ValueError auslöst. Dieses Mal kann das Programm sinnvoll darauf reagieren: Es kann mitteilen, dass keine Anzahl ermittelt wurde, und den Aufrufer entscheiden lassen, was zu tun ist.

Genau das drücken try und except aus:

def parse_quantity(text):
    try:
        quantity = int(text)
    except ValueError:
        return None

    return quantity

Lies es als kleine Vereinbarung: Versuche die Umwandlung und behandle diesen einen erwarteten Fehler, falls er auftritt. Python führt zuerst den eingerückten try-Block aus.

  • Wenn int(text) erfolgreich ist, überspringt die Ausführung den except-Block.

  • Wenn diese Umwandlung einen ValueError auslöst, führt Python den passenden Block except ValueError aus.

Die Funktion gibt None zurück. Das bedeutet: „Es konnte keine ganze Zahl erzeugt werden.“ Ein Aufrufer kann dieses Ergebnis prüfen:

result = parse_quantity("six")

if result is None:
    print("No quantity available.")
else:
    print(result)

Fange den Fehler ab, den du erwartest

Dieser Code fängt ValueError ab, weil ungeeigneter Text für eine ganze Zahl eine erwartete Situation ist, die die Funktion darstellen kann.

Er fängt nicht jede mögliche Ausnahme ab. Enthält die Funktion einen falsch geschriebenen Variablennamen, sollte ein NameError sichtbar bleiben. Diesen Programmierfehler zu verbergen würde die Fehlersuche erschweren.

Begrenze den überwachten Block

Setze nur die Operation, die die erwartete Ausnahme auslösen kann, in try:

try:
    year = int(text)
except ValueError:
    return None

Ein kleiner Block macht die Verbindung deutlich: Die Ausnahmebehandlung gehört zu dieser Umwandlung. Stehen viele unabhängige Anweisungen im Block, könnte eine passende Ausnahme aus der falschen Anweisung für den erwarteten Fehler gehalten werden.

Die Behandlung gehört zum Vertrag der Funktion

Ohne Ausnahmebehandlung stoppt ungültiger Text das Programm. Bei diesem Entwurf verspricht die Funktion eines von zwei Ergebnissen:

  • eine ganze Zahl, wenn die Umwandlung gelingt;

  • None, wenn der Text keine ganze Zahl darstellt.

Das ist eine Entwurfsentscheidung, keine Regel für jedes Programm. Manchmal ist erneutes Fragen besser. Manchmal sollte eine Ausnahme das Programm stoppen, weil die Daten auf einen tatsächlichen Programmierfehler hindeuten. Fange eine Ausnahme nur ab, wenn du einen sinnvollen nächsten Schritt ausführen kannst.

Warum verwendet das Beispiel except ValueError?

Aufgabe

Vervollständige parse_year(text).

  • Gib die umgewandelte ganze Zahl zurück, wenn sich text mit int() umwandeln lässt.

  • Gib None zurück, wenn die Umwandlung einen ValueError auslöst.

  • Fange nur ValueError ab.

Behalte die beiden vorbereiteten Aufrufe bei. Die endgültige Ausgabe muss lauten:

2026
None

Wenn es funktioniert, verwende Step für deinen fertigen Code. Beobachte, wie der erfolgreiche Aufruf die Ausnahmebehandlung überspringt und der erfolglose Aufruf sie betritt.