2016-11-08 44 views
0

我想在我的代碼如下功能異常:logging.raiseExceptions = true不會再提高

  • 記錄信息和錯誤信息,也例外控制檯和/或文件,而無需中斷程序流(即吞嚥異常,某種運行模式
  • 獲取到發展模式,其中異常升高,通過設置develop = True標誌

目前,我使用Python3 logging模塊,該模塊(根據this)應該具有完全內置的功能。該標誌是logging.raiseExceptions = True

但是,我沒有得到這個工作在MWE:我投擲的異常不會重新提出,無論我的國旗設置。

# mwe.py 
import logging 
import logging.config 

if __name__ == '__main__': 
    # Configure logging and set flag to raise exceptions 
    logging.config.fileConfig('log.conf') 
    logging.raiseExceptions = True 

    logger = logging.getLogger('root') 

    logger.info('Started') 

    # Test whether exceptions get raised 
    try: 
     raise RuntimeError("Ooops.") 
    except RuntimeError: 
     try: 
      logger.exception('There was an oops.') 
      # which is the same as logger.error('...', exc_info=True) 
     except: 
      print("GOTCHA! Exception was re-raised.") 

    logger.info('Finished') 

相應配置文件

# log.conf 
[loggers] 
keys=root 

[handlers] 
keys=consoleHandler 

[formatters] 
keys=consoleFormatter 

[logger_root] 
handlers=consoleHandler 
level=DEBUG 

[handler_consoleHandler] 
class=logging.StreamHandler 
formatter=consoleFormatter 
args=(sys.stdout,) 

[formatter_consoleFormatter] 
format=%(filename)s (%(lineno)d) %(levelname)-8s - %(message)s 

這將產生以下輸出

mwe.py (12) INFO  - Started 
mwe.py (19) ERROR - There was an oops. 
Traceback (most recent call last): 
    File "mwe.py", line 16, in <module> 
    raise RuntimeError("Ooops.") 
RuntimeError: Ooops. 
mwe.py (24) INFO  - Finished 

爲什麼我沒有得到的GOTCHA一部分,雖然Ť他的默認值raiseExceptionsTrue另外我也將它設置爲True?我的配置有什麼問題?
或者我對使用logging達到這個目的有一些很大的誤解?

(小獎金的問題:是否有配置在log.conf文件raiseException標誌的方式?)

回答

1

你理解錯了。這不會重新引發任何自定義異常。這意味着改變正在吞服的日誌記錄模塊的默認行爲內部日誌記錄異常,即錯誤配置的記錄器嘗試寫入無權寫入的文件。這會在默認情況下靜默失敗,並且設置logging.raiseException = True將導致記錄器配置錯誤或其他問題日誌記錄模塊中引發您必須處理的異常。

現在到了你想要達到的目標。在不抑制異常(讓它傳播)的情況下記錄異常回溯是缺省行爲。如果未配置日誌記錄,則回溯到stderr。如果配置了日誌記錄,則由日誌記錄處理程序將其寫入所需的位置。
所以基本上爲了達到你的目標,你根本不應該處理這個例外。但是,如果你知道如何處理異常(意味着你知道是什麼導致異常),那麼通常你不需要追蹤記錄。
如果你堅持,你仍然可以使用你的logger.exception(...)條款except RuntimeError內,用純raise重新拋出異常:

try: 
    raise RuntimeError("Ooops.") 
except RuntimeError: 
    logger.exception('There was an oops.') 
    raise 
+0

啊,我明白了。感謝您的澄清!對於自定義異常,如果我希望程序在引發時不會停止(例如,由於輸入數據不正確),那麼對於自定義異常,最佳做法是什麼?我不應該首先提出任何自定義異常,只是記錄錯誤;或者我應該提高自定義異常,然後自動處理它們(例如通過'sys.excepthook')......我在這裏有點困惑。 :/ – blsqr

+0

只要使用'try ... except',但不要在塊內重新提升它。有自定義例外是好的。 – ElmoVanKielmo