簡體   English   中英

Python:sys.excepthook並在多個模塊中記錄未捕獲的異常

[英]Python: sys.excepthook and logging uncaught exceptions across multiple modules

在我的所有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的logger。 相反,如果我反轉導入的順序(module2在module1之前),並且我嘗試相同的測試(在module2中拋出異常),我正確地得到module2的記錄器。 我原以為LATER導入優先(覆蓋前者的sys.excepthook引用),但不是。

通過在每個模塊中為每個記錄器引用提供唯一的名稱,我能夠解決這個問題(我猜...)。 所以要修改上面的代碼,這個模式的工作方式與模塊導入的順序無關:

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()實現的原因)

sys.excepthook是Python進程的全局。 您設置的最后一個值獲勝。 在模塊記錄器的不同文件中使用唯一名稱將不會對其產生任何影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM