Jak wydrukować pełny traceback bez zatrzymywania programu?
Jeśli nie chcesz zatrzymać programu z powodu błędu, musisz obsłużyć ten błąd za pomocą try / wyjątkiem:
try:
do_something_that_might_error()
except Exception as error:
handle_the_error(error)
Aby wyodrębnić pełny traceback, użyjemy traceback
modułu ze standardowej biblioteki:
import traceback
I aby stworzyć dość skomplikowane śledzenie stosu, aby pokazać, że otrzymujemy pełny stos śledzenia:
def raise_error():
raise RuntimeError('something bad happened!')
def do_something_that_might_error():
raise_error()
Druk
Aby wydrukować pełny ślad, użyj traceback.print_exc
metody:
try:
do_something_that_might_error()
except Exception as error:
traceback.print_exc()
Które wydruki:
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!
Lepsze niż drukowanie, logowanie:
Jednak najlepszą praktyką jest skonfigurowanie rejestratora dla modułu. Będzie znał nazwę modułu i będzie mógł zmieniać poziomy (między innymi atrybutami, takimi jak moduły obsługi)
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
W takim przypadku będziesz potrzebować logger.exception
funkcji:
try:
do_something_that_might_error()
except Exception as error:
logger.exception(error)
Które dzienniki:
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!
A może po prostu chcesz ciąg, w którym to przypadku będziesz potrzebować traceback.format_exc
funkcji:
try:
do_something_that_might_error()
except Exception as error:
logger.debug(traceback.format_exc())
Które dzienniki:
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!
Wniosek
I dla wszystkich trzech opcji widzimy, że otrzymujemy takie same dane wyjściowe, jak w przypadku błędu:
>>> 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]
odciski<class 'Exception'>
.