Verwenden von Ablaufverfolgungen zum Suchen nach Fehlern

Abgeschlossen

Ausnahmen in Python sind ein Kernfeature der Sprache. Möglicherweise sind Sie überrascht zu lesen, dass etwas, das Fehler erzeugt, als Feature hervorgehoben wird. Diese Überraschung kann darauf zurückzuführen sein, dass robuste Softwaretools bei einem Absturz keine Ablaufverfolgung (mehrere Textzeilen, die angeben, wie der Fehler begann und endete) anzeigen.

Ausnahmen sind jedoch nützlich, da sie bei der Entscheidungsfindung hilfreich sein können, indem beschreibende Fehlermeldungen generiert werden. Sie können Ihnen helfen, sowohl erwartete als auch unerwartete Probleme zu behandeln.

Ablaufverfolgungen

Eine Ablaufverfolgung ist der Textkörper, der auf den Ursprung (und das Ende) eines nicht behandelten Fehlers verweisen kann. Wenn Sie die Komponenten einer Ablaufverfolgung verstehen, werden Sie effektiver, wenn Sie Fehler beheben oder ein Programm debuggen, das nicht gut funktioniert.

Wenn Sie zum ersten Mal auf Ausnahmen in Python stoßen, sind Sie möglicherweise versucht, den Fehler zu vermeiden, indem Sie ihn unterdrücken. Wenn ein Programm einen nicht behandelten Fehler aufweist, wird eine Ablaufverfolgung als Ausgabe angezeigt. Wie Sie in diesem Modul sehen werden, sind Ablaufverfolgungen nützlich. Es gibt Möglichkeiten, die Fehler ordnungsgemäß zu behandeln, damit sie beseitigt werden oder nur hilfreiche Informationen anzeigen.

Öffnen Sie eine interaktive Python-Sitzung, und versuchen Sie, eine nicht vorhandene Datei zu öffnen:

open("/path/to/mars.jpg")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/mars.jpg'

Diese Ausgabe besteht aus mehreren wichtigen Teilen. Zuerst nennt die Ablaufverfolgung die Reihenfolge der Ausgabe. Dann werden Sie darüber informiert, dass die Datei stdin (Eingabe im interaktiven Terminal) in der ersten Zeile der Eingabe ist. Der Fehler ist FileNotFoundError (der Ausnahmename), was bedeutet, dass die Datei oder möglicherweise das Verzeichnis, in dem sie enthalten sein soll, nicht vorhanden ist.

Das sind viele Informationen. Es kann schwierig sein zu verstehen, warum Zeile 1 aussagekräftig ist oder was Errno 2 bedeutet.

Öffnen Sie ihr gewünschtes Verzeichnis in Visual Studio Code, und erstellen Sie eine Python-Datei mit dem Namen open.py.

Screenshot showing the creation of a new Python file in Visual Studio Code.

Fügen Sie der Datei folgenden Inhalt hinzu, und speichern Sie sie:

def main():
    open("/path/to/mars.jpg")

if __name__ == '__main__':
    main()

Es handelt sich um eine einzelne main()-Funktion, die die nicht vorhandene Datei wie zuvor öffnet. Am Ende verwendet diese Funktion ein Python-Hilfsprogramm, das den Interpreter anweist, die main()-Funktion auszuführen, wenn sie im Terminal aufgerufen wird. Führen Sie den Befehl in einem Bash-Terminal mit Python aus, und überprüfen Sie die Fehlermeldung:

python3 open.py
Traceback (most recent call last):
  File "/tmp/open.py", line 5, in <module>
    main()
  File "/tmp/open.py", line 2, in main
    open("/path/to/mars.jpg")
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/mars.jpg'

Die Fehlerausgabe ergibt jetzt mehr Sinn. Die Pfade verweisen auf eine einzelne Datei namens open.py. In der Ausgabe wird erwähnt, dass der Fehler in Zeile 5 beginnt, die den Aufruf von main() enthält. Anschließend folgt die Ausgabe dem Fehler bis Zeile 2 im open()-Funktionsaufruf. Und schließlich meldet FileNotFoundError erneut, dass die Datei oder das Verzeichnis nicht vorhanden ist.

Ablaufverfolgungen enthalten fast immer die folgenden Informationen:

  • Alle beteiligten Dateipfade für jeden Aufruf jeder Funktion.
  • Jedem Dateipfad zugeordnete Zeilennummern.
  • Die Namen von Funktionen, Methoden oder Klassen, die an der Generierung einer Ausnahme beteiligt sind.
  • Der Name der ausgelösten Ausnahme.