Wie kann man den vollständigen Traceback ausdrucken, ohne das Programm anzuhalten?
Wenn Sie Ihr Programm bei einem Fehler nicht anhalten wollen, müssen Sie diesen Fehler mit einem try/except behandeln:
try:
do_something_that_might_error()
except Exception as error:
handle_the_error(error)
Um den vollständigen Traceback zu extrahieren, verwenden wir die traceback
Modul aus der Standardbibliothek:
import traceback
Und um einen anständig komplizierten Stacktrace zu erstellen, um zu demonstrieren, dass wir den vollständigen Stacktrace erhalten:
def raise_error():
raise RuntimeError('something bad happened!')
def do_something_that_might_error():
raise_error()
Drucken
An drucken den vollständigen Traceback, verwenden Sie die traceback.print_exc
Methode:
try:
do_something_that_might_error()
except Exception as error:
traceback.print_exc()
Welche Drucke:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
Besser als Drucken, Protokollieren:
Am besten ist es jedoch, einen Logger für Ihr Modul einzurichten. Er kennt den Namen des Moduls und ist in der Lage, die Ebenen zu ändern (neben anderen Attributen, wie z. B. Handler)
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
In diesem Fall müssen Sie die logger.exception
stattdessen die Funktion:
try:
do_something_that_might_error()
except Exception as error:
logger.exception(error)
Welche Protokolle:
ERROR:__main__:something bad happened!
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
Oder vielleicht wollen Sie nur die Zeichenkette, in diesem Fall brauchen Sie die traceback.format_exc
stattdessen die Funktion:
try:
do_something_that_might_error()
except Exception as error:
logger.debug(traceback.format_exc())
Welche Protokolle:
DEBUG:__main__:Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
Schlussfolgerung
Bei allen drei Optionen erhalten wir die gleiche Ausgabe wie bei einem Fehler:
>>> do_something_that_might_error()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
Was zu verwenden ist
Leistungsaspekte sind hier nicht wichtig, da IO normalerweise dominiert. Ich würde es bevorzugen, da es genau das tut, was in einer vorwärtskompatiblen Weise angefordert wird:
logger.exception(error)
Logging-Level und -Outputs können angepasst werden, so dass sie leicht ausgeschaltet werden können, ohne den Code zu berühren. Und in der Regel ist es am effizientesten, nur das zu tun, was direkt benötigt wird.
17 Stimmen
Das ist zwar keine vollständige Antwort, aber vielleicht möchte jemand wissen, dass man viele Informationen erhalten kann, wenn man in
err.__traceback__
(zumindest in Python 3.x)35 Stimmen
Es wurde 825.000 Mal aufgerufen, während man versuchte, herauszufinden, wie man seine Stacktraces ausdrucken kann. Das ist ein weiteres Zen von Python.
13 Stimmen
Anscheinend bin ich der Einzige auf der Welt, der den Stapel ausdrucken möchte. wenn kein Fehler vorliegt (= nur um zu sehen, wie ich genau zu dieser Zeile gekommen bin (es ist nicht mein Code, und er ist so hässlich, dass ich nicht weiß, wie er hierher gekommen ist!)).
1 Stimmen
Alle Antworten auf diese Frage sind der ultimative Anfängerleitfaden zum Debuggen von Python-Code