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 denexcept-Block.Wenn diese Umwandlung einen
ValueErrorauslöst, führt Python den passenden Blockexcept ValueErroraus.
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
textmitint()umwandeln lässt.Gib
Nonezurück, wenn die Umwandlung einenValueErrorauslöst.Fange nur
ValueErrorab.
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.