说我有这样的事情,这将unhanded例外logging.critical()
:添加功能sys.excepthook
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”属性以避免重复注册)
是否有推荐的方法来执行此操作?
黑魔法的东西,但我喜欢它:) –