Щоб відповісти на запитання Mr.Zeus, обговорене в розділі коментарів прийнятої відповіді, я використовую це для того, щоб записувати невиконані винятки в інтерактивній консолі (протестовано з PyCharm 2018-2019). Я виявив, sys.excepthook
що не працює в оболонці пітона, тому я заглянув глибше і виявив, що можу використовувати sys.exc_info
замість цього. Однак sys.exc_info
не бере аргументів на відміну від того, sys.excepthook
що бере 3 аргументи.
Тут я використовую обидва sys.excepthook
і sys.exc_info
записую обидва винятки в інтерактивній консолі та скрипті з функцією обгортки. Щоб прикріпити функцію гака до обох функцій, у мене є два різних інтерфейсу залежно від того, подано аргументи чи ні.
Ось код:
def log_exception(exctype, value, traceback):
logger.error("Uncaught exception occurred!",
exc_info=(exctype, value, traceback))
def attach_hook(hook_func, run_func):
def inner(*args, **kwargs):
if not (args or kwargs):
# This condition is for sys.exc_info
local_args = run_func()
hook_func(*local_args)
else:
# This condition is for sys.excepthook
hook_func(*args, **kwargs)
return run_func(*args, **kwargs)
return inner
sys.exc_info = attach_hook(log_exception, sys.exc_info)
sys.excepthook = attach_hook(log_exception, sys.excepthook)
Налаштування журналу можна знайти у відповіді gnu_lorien.