2017-09-21 36 views
0

根據Python's Logging tutoriallogging.error將被用於「報告抑制錯誤而不引發異常」,而如果我想報告一個錯誤,我應該引發一個異常並且根本不使用logging顯示錯誤信息的正確方法

如果我想報告錯誤然後引發異常,該怎麼辦?

例如:

try:                   
    os.path.getsize('/nonexistent')           
except os.error as error:             
    logging.error(str(error))            
    logging.error('something went wrong')         
    raise SystemExit(1)              

這導致下面的行被打印到標準誤差:

ERROR:root:[Errno 2] No such file or directory: '/nonexistent' 
ERROR:root:something went wrong 

這似乎是合理的。或者:

try:                   
    os.path.getsize('/nonexistent')           
except os.error as error:             
    logging.error(str(error))            
    raise SomeUserDefinedException('something went wrong') 

這是不好的做法嗎?

回答

1
  • logging用於報告。
  • raise是一箇中斷程序正常流程的動作。

通常情況下,你raise例外情況有一個實際的流量中斷,而當你要報案,就可以使用logging,這將默認記錄錯誤和異常。

logging零件通常用作程序中模塊,類或中間件的包裝。

logging在代碼中應只用於DEBUG目的,或用於INFO目的,如果你想跟蹤的一些信息,例如您的服務器日誌。不適用於錯誤

+0

那麼,一個人應該用來報告錯誤? –

+0

您應該在全局範圍內設置日誌記錄以捕獲任何錯誤和異常,並且它會顯示您在'raise'條件中設置的異常消息。 – MrE

1

我不認爲這是一個不好的做法。例外和日誌記錄有兩種不同的用途,在任何特定的情況下,您可能需要一種,另一種或兩種。例外情況是代碼中的程序化消耗和控制流,而日誌記錄則是由外部消費人員或某種自動日誌監視器(例如Splunk)進行的。例如,您可以記錄某些變量的值,以幫助您找出發生的情況並改進代碼,但在這種情況下,調試級別會更合適。或者您可能希望系統管理員瞭解此問題並可能採取一些措施。在這種情況下,將日誌級別設置爲錯誤並使用像syslog日誌記錄處理程序是有道理的。