Wie können Sie programmgesteuert untersuchen Sie den stack-trace der exception in Python?
Wenn eine Ausnahme Auftritt in Python, können Sie untersuchen Sie den stack? Können Sie bestimmen, seiner Tiefe? Ich habe die traceback Modul, aber ich kann nicht herausfinden, wie es zu benutzen.
Mein Ziel ist es, alle Ausnahmen abzufangen, die auftreten, während der Analyse einer eval-Ausdruck, ohne den Fang Ausnahmen, die von Funktionen kann es haben, genannt. Nicht beschimpfen, mich für die Verwendung von eval. Es war nicht meine Entscheidung.
HINWEIS: ich möchte dies programmatisch tun, nicht interaktiv.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die überprüfen - Modul hat einige utility-Funktionen, die für die Verfolgung. Haben Sie einen Blick auf die übersicht über die Eigenschaften der frame-Objekte.
traceback
genug ist - und ich nehme an, dass die Dokumentation beschreibt es Recht gut. Vereinfachtes Beispiel:eval
text ist falsch.Ich mag die traceback-Modul.
Können Sie eine traceback-Objekt mit
sys.exc_info()
. Dann können Sie das-Objekt, um eine Liste mit vorberechneten Liste der traceback-Einträge mittraceback.extract_tb()
. Dann können Sie sich in eine lesbare Liste mittraceback.format_list()
wie folgt:Finden Sie unter sys-Modul: http://docs.python.org/library/sys.html
und die traceback-Modul: http://docs.python.org/library/traceback.html
Definieren Sie eine solche Funktion (doc hier):
und rufen Sie es von Ihre Module so:
Die Funktion raiseErr wird die print-Infos über den Ort, den Sie genannt haben.
Aufwendiger, können Sie dies tun:
Andere Möglichkeit ist die Definition dieser Funktion:
Und rufen Sie es in dem Ort, wo Sie wollen die Spur. Wenn Sie möchten, dass alle auf der Spur, machen einen iterator von 1 bis in
_getframe(1)
.Neben AndiDog Antwort über
inspect
beachten Sie, dasspdb
können Sie die Navigation nach oben und unten den Stapel, Inspektion einheimische und solche Dinge. Die Quelle in der standard-Bibliothekpdb.py
hilfreich sein könnten, um Sie in das lernen, wie solche Dinge zu tun.