Wie drucke ich den vollständigen Traceback, ohne das Programm anzuhalten?
Wenn Sie Ihr Programm bei einem Fehler nicht anhalten möchten, müssen Sie diesen Fehler mit einem Versuch / außer behandeln:
try:
do_something_that_might_error()
except Exception as error:
handle_the_error(error)
Um den vollständigen Traceback zu extrahieren, verwenden wir das 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
Verwenden Sie die Methode, um den vollständigen Traceback zu druckentraceback.print_exc
:
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:
Es wird jedoch empfohlen, einen Logger für Ihr Modul einzurichten. Es kennt den Namen des Moduls und kann Ebenen ändern (unter anderem Attribute wie Handler).
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
In diesem Fall möchten Sie 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 möchten Sie nur die Zeichenfolge. In diesem Fall möchten Sie 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!
Fazit
Und für alle drei Optionen erhalten wir dieselbe 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!
print(sys.exc_info()[0]
druckt<class 'Exception'>
.