Ich habe viele Beiträge über Stack-Trace und Ausnahmen in Python gesehen. Aber ich habe nicht gefunden, was ich brauche.
Ich habe einen Teil des Python 2.7-Codes, der möglicherweise eine Ausnahme auslöst. Ich möchte es abfangen und einem String seine vollständige Beschreibung und den Stack-Trace zuweisen , der den Fehler verursacht hat (einfach alles, was wir verwenden, um auf der Konsole zu sehen). Ich benötige diese Zeichenfolge, um sie in ein Textfeld in der GUI zu drucken.
Etwas wie das:
try:
method_that_can_raise_an_exception(params)
except Exception as e:
print_to_textbox(complete_exception_description(e))
Das Problem ist: Was ist die Funktion complete_exception_description
?
python
python-2.7
exception-handling
stack-trace
bläulich
quelle
quelle
log_error(err)
Funktion.Lassen Sie uns einen anständig komplizierten Stacktrace erstellen, um zu demonstrieren, dass wir den vollständigen Stacktrace erhalten:
Protokollierung des vollständigen Stacktraces
Eine bewährte Methode besteht darin, einen Logger für Ihr Modul einzurichten. Es kennt den Namen des Moduls und kann Ebenen ändern (unter anderem Attribute wie Handler).
Und wir können diesen Logger verwenden, um den Fehler zu erhalten:
Welche Protokolle:
Und so erhalten wir die gleiche Ausgabe wie bei einem Fehler:
Nur die Schnur bekommen
Wenn Sie wirklich nur die Zeichenfolge möchten, verwenden Sie
traceback.format_exc
stattdessen die Funktion, um die Protokollierung der Zeichenfolge hier zu demonstrieren:Welche Protokolle:
quelle
except Exception as e: logger.exception("<<clearly and distinctly describe what failed here>>", exc_info=e)
exc_info
erwartet Argument einen „exception Tupel“ , während dieerror
eine Instanz der ISException
Objekt (oder Unterklasse), und es gibt keine Notwendigkeit zur Veränderungerror
zue
.Mit Python 3 formatiert der folgende Code ein
Exception
Objekt genau so, wie es mit erhalten würdetraceback.format_exc()
:Der Vorteil besteht darin, dass nur das
Exception
Objekt benötigt wird (dank des aufgezeichneten__traceback__
Attributs) und daher leichter als Argument zur weiteren Verarbeitung an eine andere Funktion übergeben werden kann.quelle
.__traceback__
undtype
, siehe stackoverflow.com/a/58764987/5717886Mit sys.exc_info () sammeln Sie die Informationen und die Funktionen im
traceback
Modul, um sie zu formatieren. Hier sind einige Beispiele für die Formatierung.Die gesamte Ausnahmezeichenfolge lautet:
quelle
Für diejenigen, die Python-3 verwenden
Mit
traceback
Modul undexception.__traceback__
kann man den Stack-Trace wie folgt extrahieren:traceback.extract_stack()
__traceback__
aus dem Ausnahmeobjekt mit antraceback.extract_tb()
traceback.format_list()
Eine einfache Demonstration:
Wir erhalten die folgende Ausgabe, wenn wir anrufen
bar()
:quelle
Sie können auch das integrierte Python-Modul cgitb verwenden , um einige wirklich gute, gut formatierte Ausnahmeinformationen zu erhalten, einschließlich lokaler Variablenwerte, Quellcodekontext, Funktionsparameter usw.
Zum Beispiel für diesen Code ...
wir bekommen diese Ausnahmeausgabe ...
quelle
Wenn Sie dieselben Informationen erhalten möchten, wenn eine Ausnahme nicht behandelt wird, können Sie Folgendes tun. Tun
import traceback
und dann:Ich benutze Python 3.7.
quelle
Für Python 3.5+ :
Sie können also die Stapelverfolgung von Ihrer Ausnahme wie von jeder anderen Ausnahme abrufen. Verwenden Sie
traceback.TracebackException
es (ersetzenex
Sie es einfach durch Ihre Ausnahme):Ein erweitertes Beispiel und andere Funktionen, um dies zu tun:
Die Ausgabe wird ungefähr so aussehen:
quelle
meine 2 Cent:
quelle
Wenn Ihr Ziel darin besteht, die Ausnahme- und Stacktrace-Nachricht genau so aussehen zu lassen, wie wenn Python einen Fehler auslöst, funktioniert Folgendes in Python 2 + 3:
Es funktioniert, indem der letzte
format_stacktrace()
Aufruf vom Stapel entfernt und der Rest verbunden wird. Im obigen Beispiel wird beim Ausführen die folgende Ausgabe ausgegeben:quelle
Ich habe folgende Hilfsklasse definiert:
Was ich später so verwenden kann:
Und später kann es so konsumieren:
(Hintergrund: Ich war frustraded, weil ich
Promise
s zusammen mitException
s verwendet habe, was leider Ausnahmen, die an einer Stelle ausgelöst wurden, an einen on_rejected-Handler an einer anderen Stelle weitergibt, und daher ist es schwierig, den Traceback vom ursprünglichen Ort zu erhalten.)quelle