Скажем, у меня есть что-то вроде этого, которое отправляет необработанные исключения на logging.critical()
:
import sys
def register_handler():
orig_excepthook = sys.excepthook
def error_catcher(*exc_info):
import logging
log = logging.getLogger(__name__)
log.critical("Unhandled exception", exc_info=exc_info)
orig_excepthook(*exc_info)
sys.excepthook = error_catcher
Работает:
import logging
logging.basicConfig()
register_handler()
undefined() # logs, then runs original excepthook
Однако, если register_handler()
вызывается несколько раз, в цепочке вызывается несколько error_catcher
, и сообщение журнала появляется несколько раз ..
Я могу придумать несколько способов, но ни один из них не особенно хорош (например, проверка, является ли sys.excepthook
функцией error_catcher, или использование атрибута have_registered) в модуле, чтобы избежать двойной регистрации)
Есть ли рекомендуемый способ сделать это?