Чтобы ответить на вопрос г-на Зеуса, который обсуждался в разделе комментариев принятого ответа, я использую его для регистрации необработанных исключений в интерактивной консоли (протестировано с PyCharm 2018-2019). Я обнаружил, sys.excepthook
что не работает в оболочке Python, поэтому я посмотрел глубже и обнаружил, что я мог бы использовать 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.