0%

Fehler, Validierung und Fehlersuche · Übung

Untersuche Werte, bevor du rätst

Logikfehler erzeugen keinen Traceback. Wenn das Endergebnis falsch ist, untersuche die Werte, die dazu führen.

Angenommen, ein Befehl wird nicht erkannt:

raw_choice = "  START "
choice = raw_choice.lower()

if choice == "start":
    print("Starting")
else:
    print("Unknown command")

Du könntest vermuten, dass lower() nicht funktioniert oder der Vergleich falsch ist. Eine vorübergehende Diagnoseausgabe liefert bessere Anhaltspunkte:

print(f"raw: >{raw_choice}<")
print(f"cleaned: >{choice}<")

Die sichtbaren Markierungen zeigen Leerzeichen um den Text:

raw: >  START <
cleaned: >  start <

Die Groß- und Kleinschreibung hat sich geändert, die Leerzeichen sind geblieben. Jetzt ist die nächste Änderung begründet: Entferne beim Bereinigen auch die umgebenden Leerraumzeichen.

Werte, deren Untersuchung hilft

Gib bei der Fehlersuche Folgendes aus:

  • einen Wert mit einer Beschriftung;

  • Begrenzungszeichen um Strings, damit Leerraum sichtbar wird;

  • type(value), wenn eine Annahme über den Typ falsch sein könnte;

  • Werte vor und nach einer Umwandlung;

  • Werte direkt vor einer fehlschlagenden Bedingung oder Berechnung.

Zum Beispiel:

print("quantity:", quantity)
print("quantity type:", type(quantity))

Eine aussagekräftige Beschriftung ist wichtig. Ein Terminal voller unbeschrifteter Zahlen lässt sich schwer deuten.

Verwende Diagnoseausgaben nur vorübergehend

Diagnoseausgaben dienen der Untersuchung und gehören nicht zum zugesagten Ergebnis des Programms. Sobald die Ursache behoben ist:

  1. Führe das Programm aus und bestätige die Korrektur.

  2. Entferne die vorübergehenden Ausgaben.

  3. Führe es erneut aus, um zu prüfen, dass die endgültige Ausgabe keine Diagnosezeilen mehr enthält.

In einer Editorübung kannst du auch Step verwenden, um Änderungen an Variablen Anweisung für Anweisung zu beobachten. Vorübergehende Ausgaben bleiben dennoch eine wertvolle, vielseitige Technik: Sie funktionieren in kleinen Programmen, Funktionen, Schleifen und den meisten Laufzeitumgebungen.

Prüfe eine Annahme, statt eine Vermutung auszuschmücken

Jede Diagnoseausgabe sollte eine Frage beantworten:

  • Enthält dieser String noch Leerzeichen?

  • Ist dieser Wert eine ganze Zahl oder ein String?

  • Welchen Zweig hat die Bedingung gewählt?

  • Welche Werte haben die Operanden vor der Berechnung?

Wenn eine Ausgabe nicht dabei hilft, mögliche Ursachen zu unterscheiden, wähle eine gezieltere.

Warum sind > und < um einen String in einer Diagnoseausgabe hilfreich?

Aufgabe

Das vorgegebene Programm sollte den vorbereiteten Befehl trotz seiner Großschreibung und der umgebenden Leerzeichen akzeptieren. Derzeit lehnt es ihn ab.

Führe das Programm zuerst mit den beiden Diagnosezeilen aus. Ermittle anhand ihrer Ausgabe, was beim Bereinigen fehlt. Dann:

  1. Korrigiere den Ausdruck zum Bereinigen.

  2. Entferne beide vorübergehenden Diagnoseausgaben.

  3. Führe das Programm erneut aus.

Die endgültige Ausgabe darf nur Folgendes enthalten:

Command accepted.

Wenn es funktioniert, verwende Step für deinen fertigen Code und beobachte, wie raw_code und clean_code ihre Werte erhalten.