0%

Fehler, Validierung und Fehlersuche

Fange nur ab, was du behandeln kannst

Ausnahmebehandlung ist hilfreich, wenn ein Programm einen bestimmten Fehler erwartet und weiß, wie es danach fortfahren kann. Sie wird schädlich, wenn sie Probleme verbirgt, die das Programm gar nicht behandeln kann.

Vermeide pauschales Abfangen

Dieser Code fängt zu viel ab:

text = "3"
recipe_cost = 24

try:
    servings = int(text)
    total = recipe_cost / servngs
except:
    print("Please enter a number.")

Der falsch geschriebene Name servngs verursacht einen NameError, kein Problem beim Umwandeln der Eingabe. Ein bloßes except: fängt ihn trotzdem ab und gibt einen irreführenden Hinweis aus. Der Nutzer kann endlos Zahlen eingeben, aber den Tippfehler im Programm kann das nicht beheben.

Dasselbe Problem tritt hier auf:

except Exception:
    print("Something went wrong.")

Diese Syntax ist ausdrücklicher, fasst aber weiterhin viele voneinander unabhängige Fehler zusammen.

Stimme die Ausnahmebehandlung auf die mögliche Reaktion ab

Überwache nur die erwartete Umwandlung:

try:
    servings = int(text)
except ValueError:
    print("Please enter a whole number.")

Jetzt erhält ungültiger Text einen hilfreichen Hinweis. Ein späterer NameError, ZeroDivisionError oder eine andere unerwartete Ausnahme bleibt mit ihrem Traceback sichtbar.

Diese Sichtbarkeit ist wertvoll. Sie zeigt beim Programmieren, was tatsächlich korrigiert werden muss.

Halte try-Blöcke klein

Vergleiche:

try:
    count = int(text)
    subtotal = count * price
    print(make_label(subtotal))
except ValueError:
    print("Enter a whole number.")

mit:

try:
    count = int(text)
except ValueError:
    print("Enter a whole number.")

Der erste Block enthält drei Operationen. Wenn eine andere Operation einen ValueError auslöst, könnte die Ausnahmebehandlung fälschlicherweise die Eingabe verantwortlich machen. Der zweite Block macht den beabsichtigten Zusammenhang deutlich.

Drei Fragen vor dem Abfangen

Frage dich:

  1. Welche genaue Operation kann fehlschlagen?

  2. Welche genaue Ausnahme löst sie aus?

  3. Wie kann das Programm nach diesem Fehler sinnvoll weiterarbeiten?

Wenn du nicht alle drei Fragen beantworten kannst, lass die Ausnahme während der Untersuchung sichtbar.

Eine Ausnahmebehandlung macht ein Programm nicht automatisch zuverlässig. Zuverlässigkeit entsteht, indem du erwartete Fehler verstehst, Annahmen prüfst und hilfreiche Hinweise auf unerwartete Fehler bewahrst.

Was ist die größte Gefahr eines bloßen except: in einfachem Code zur Eingabeverarbeitung?

Welcher try-Block lässt sich am leichtesten nachvollziehen, wenn ungültiger Text für eine ganze Zahl behandelt werden soll?