Как распечатать полную трассировку без остановки программы?
Если вы не хотите останавливать свою программу из-за ошибки, вам нужно обработать эту ошибку с помощью try / кроме:
try:
do_something_that_might_error()
except Exception as error:
handle_the_error(error)
Для извлечения полной трассировки мы будем использовать traceback
модуль из стандартной библиотеки:
import traceback
И создать довольно сложную трассировку стека, чтобы продемонстрировать, что мы получаем полную трассировку стека:
def raise_error():
raise RuntimeError('something bad happened!')
def do_something_that_might_error():
raise_error()
печать
Чтобы распечатать полную трассировку, используйте traceback.print_exc
метод:
try:
do_something_that_might_error()
except Exception as error:
traceback.print_exc()
Какие отпечатки:
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!
Лучше, чем печать, регистрация:
Однако лучше всего настроить регистратор для вашего модуля. Он будет знать имя модуля и сможет изменять уровни (среди других атрибутов, таких как обработчики)
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
В этом случае вам понадобится logger.exception
функция вместо:
try:
do_something_that_might_error()
except Exception as error:
logger.exception(error)
Какие журналы:
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!
Или, возможно, вам просто нужна строка, в этом случае вам понадобится traceback.format_exc
функция:
try:
do_something_that_might_error()
except Exception as error:
logger.debug(traceback.format_exc())
Какие журналы:
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!
Вывод
И для всех трех опций мы видим, что получаем тот же результат, что и при появлении ошибки:
>>> 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]
отпечатки<class 'Exception'>
.