0%

Fehler, Validierung und Fehlersuche · Übung

Lies einen Traceback von unten

Wenn eine Ausnahme ein Programm stoppt, gibt Python einen Traceback aus. Er zeigt als Spur, welche Zeilen aktiv waren, als das Problem auftrat.

Hier ist ein kleines Beispiel:

def cost_per_guest(total_cost, guests):
    return total_cost / guests


def show_summary():
    amount = cost_per_guest(90, 0)
    print(amount)


show_summary()

Der Traceback enthält mehrere Zeilen, aber du musst ihn nicht wie eine Geschichte von oben lesen.

Beginne unten

In der letzten Zeile steht etwa:

ZeroDivisionError: division by zero

Sie nennt dir:

  • den Ausnahmetyp: ZeroDivisionError;

  • die Meldung: division by zero.

Das zeigt dir sofort, welche Operation fehlgeschlagen ist.

Gehe nach oben zu deinem Code

Über der letzten Zeile verweist der Traceback auf die Division in cost_per_guest. Ein weiterer Eintrag zeigt, dass show_summary die Funktion aufgerufen hat.

Diese Spur ist wichtig, weil die Zeile, in der Python ein Problem bemerkt, nicht immer die Stelle ist, an der der falsche Wert entstanden ist. Die Division findet innerhalb der Funktion statt, aber show_summary hat die null übergeben.

Lies jeden relevanten Eintrag so:

Diese Zeile wurde gerade ausgeführt, und der Weg dorthin führte über den Eintrag darüber.

Die angegebene Zeile ist ein Hinweis, kein Urteil

Ändere nicht automatisch die zuletzt hervorgehobene Zeile. Frage zuerst:

  • Welche Werte haben diese Operation erreicht?

  • Woher kamen diese Werte?

  • Welcher Wert verletzt die Anforderung des Programms?

Wenn null Gäste in diesem Programm unmöglich sind, ist der Aufruf falsch. Wenn null eine mögliche echte Eingabe ist, braucht das Programm vor der Division eine Validierung. Die späteren Lektionen bauen diese Validierung auf.

Eine verlässliche Leseroutine

  1. Lies unten den Ausnahmetyp und die Meldung.

  2. Gehe nach oben, bis du Zeilen aus deinem Programm findest.

  3. Ermittle die fehlgeschlagene Operation.

  4. Verfolge verdächtige Werte zurück zu der Stelle, an der sie erstellt oder übergeben wurden.

  5. Nimm eine begründete Änderung vor und führe das Programm erneut aus.

Verfolge diese Routine jetzt in der Abbildung unten. Das Programm läuft nach unten, vom Aufrufer bis zum Fehler. Du beginnst dagegen beim nummerierten Schritt unten und liest nach oben. Untersuche diese beiden entgegengesetzten Richtungen.

Ein Traceback verläuft vom Aufrufer zur fehlgeschlagenen Zeile und zur Fehlermeldung. Die empfohlene Leserichtung beginnt dagegen unten bei der Fehlermeldung und geht dann nach oben zur fehlgeschlagenen Zeile und zum Aufrufer.

Das Terminal zeigt den Traceback, wenn du Code ausführst. Bei der Bewertung können dieselben Informationen unter der Bezeichnung Python error output erscheinen.

Welchen Teil eines Tracebacks solltest du normalerweise zuerst lesen?

Der Traceback endet für diese Zeile mit ZeroDivisionError: division by zero:

return kilometers / hours

Welchen Wert solltest du zuerst zurückverfolgen?

Aufgabe

Das vorgegebene Programm soll die durchschnittlichen Punkte pro Spieler anzeigen, bricht aber mit einer Ausnahme ab.

Führe es einmal aus und lies den Traceback von unten. Verfolge den ungültigen Wert bis zum Funktionsaufruf zurück. Korrigiere dann den Aufruf so, dass das Programm insgesamt 48 Punkte auf 6 Spieler verteilt.

Das fertige Programm muss Folgendes ausgeben:

8.0

Lass die Funktion und ihre Division unverändert. Der Fehler liegt in dem Wert, den der Aufruf übergibt.