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:
Lies den fehlenden Schlüssel, der unten im Traceback genannt wird.
Untersuche den tatsächlichen Inhalt des Dictionarys.
Vergleiche beides mit dem vorgesehenen Datenaufbau des Programms.
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
tryundexcept.Behalte das vorbereitete Dictionary bei.
Das fertige Programm darf nur Folgendes ausgeben:
Creator: Octavia E. Butler