在我的所有Python主要脚本和模块中,我一直在尝试实现一种方法,将未捕获的异常记录到抛出异常的模块的记录器中。我在所有文件中都这样做:
def log_unhandled_exception(*exc_info):
text = "".join(traceback.format_exception(*exc_info))
logger.critical("An unhandled exception has caused this script to terminate prematurely. Here are the details: {0}".format(text))
sys.exit(2)
def some_function():
# ...
sys.excepthook = log_unhandled_exception
logger = logging.getLogger("Module1") # or "Module2", "Module3", etc., each module has it's own logger
当我遇到未被捕获的例外情况时,我有时候无法获得预定的记录器。我认为它与我导入模块的顺序有关:如果我导入module1然后导入module2,然后在module2中调用一个函数并遇到异常,我似乎得到了module1&#39的记录器。相反,如果我颠倒了导入的顺序(module2在module1之前),并且我尝试了相同的测试(在module2中抛出异常),我正确地得到了module2的记录器。我原以为LATER导入优先(覆盖前者的sys.excepthook引用),但没有。
我能够通过在每个模块中为每个记录器引用提供唯一名称来解决此问题(我猜...)。因此,要修改上面的代码,THIS模式的工作方式与模块导入的顺序无关:
def log_unhandled_exception(*exc_info):
text = "".join(traceback.format_exception(*exc_info))
module1_logger.critical("An unhandled exception has caused this script to terminate prematurely. Here are the details: {0}".format(text))
sys.exit(2)
def some_function():
# ...
sys.excepthook = log_unhandled_exception
module1_logger = logging.getLogger("Module1") # or "Module2", "Module3", etc., each module has it's own logger
这是实现我的目标的正确方法,每个模块都有自己的记录器,每个模块都使用它的记录器来记录未捕获的异常。
(实际代码更加多样化,并且每个模块都有自己的log_unhandled_exception()实现的原因)
答案 0 :(得分:2)
sys.excepthook
对于您的Python进程来说是全局的。您设置的最后一个值获胜。在模块记录器的不同文件中使用唯一名称不会对其产生任何影响。