Як надрукувати повний трекбек без зупинки програми?
Якщо ви не хочете зупиняти програму на помилці, вам потрібно обробити цю помилку за допомогою спроби / за винятком:
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'>
.