0%

Fehler, Validierung und Fehlersuche · Übung

Behebe die Ursache, nicht das Symptom

Ein Programm kann scheinbar einen Fehler bewältigen und dabei den eigentlichen Fehler unangetastet lassen.

Stell dir vor, jeder Veranstaltungsdatensatz muss diese Schlüssel enthalten:

event = {
    "name": "Night market",
    "city": "Taipei",
}

Das Programm fragt versehentlich einen anderen Schlüssel ab:

try:
    print(event["location"])
except KeyError:
    print("Location unavailable.")

Die Ausnahmebehandlung verhindert einen Traceback, verbirgt aber auch einen Widerspruch zwischen dem vorgeschriebenen Aufbau des Datensatzes und dem Zugriff. Wenn "city" erforderlich ist, besteht die sinnvolle Korrektur darin, den richtigen erforderlichen Schlüssel zu verwenden.

Bei optionalen Daten ist es anders

Manchmal ist ein Feld tatsächlich optional:

print(event.get("website", "No website listed"))

Kapitel 9 hat .get() für diese Situation eingeführt. Eine fehlende optionale Website ist ein normaler Datenfall und nicht unbedingt ein Fehler.

Der Unterschied liegt in der Anforderung:

  • Erforderlicher Schlüssel fehlt oder ist falsch geschrieben: Untersuche und korrigiere die Daten oder den Zugriff.

  • Optionaler Schlüssel fehlt: Verwende einen dokumentierten Ersatzwert.

  • Externe oder unsichere Daten: Validiere sie an der Stelle, an der sie in das Programm gelangen.

Entscheide nicht nur danach, ob sich eine Ausnahme abfangen lässt.

Verfolge die Hinweise zurück zum Ursprung

Wenn ein Zugriff auf einen erforderlichen Schlüssel einen KeyError auslöst:

  1. Lies den fehlenden Schlüssel, der unten im Traceback genannt wird.

  2. Untersuche den tatsächlichen Inhalt des Dictionarys.

  3. Vergleiche beides mit dem vorgesehenen Datenaufbau des Programms.

  4. Korrigiere die Stelle, die von diesem Aufbau abweicht.

Eine vorübergehende Ausgabe des Dictionarys kann bei der Untersuchung helfen:

print(event)

Entferne diese Diagnoseausgabe, sobald die Ursache klar ist.

Die Fehlerbehandlung sollte die Bedeutung bewahren

Ein Ersatzwert wie "unavailable" ändert die Bedeutung des Programms. Er sagt aus, dass fehlende Daten akzeptabel sind. Bei einem optionalen Feld kann das richtig sein, bei einem erforderlichen falsch.

Gute Fehlersuche bringt nicht nur eine Fehlermeldung zum Schweigen. Sie stellt das zugesagte Verhalten des Programms wieder her.

Ein Dictionary-Format verlangt den Schlüssel "email", aber der Code greift auf "mail" zu und fängt den entstehenden KeyError ab. Was ist die beste erste Korrektur?

Aufgabe

Das Katalogformat verlangt für jeden Eintrag die Schlüssel "title" und "creator".

Das vorgegebene Programm fängt einen KeyError ab und gibt eine Ersatzmeldung aus, obwohl die erforderliche Angabe zum Urheber bereits vorhanden ist. Behebe die Ursache:

  • Verwende den richtigen erforderlichen Schlüssel.

  • Entferne das unnötige try und except.

  • Behalte das vorbereitete Dictionary bei.

Das fertige Programm darf nur Folgendes ausgeben:

Creator: Octavia E. Butler