2017-05-18 32 views
1
if語句

簡而言之登錄手動引發的異常,我有一段代碼,看起來像這樣:你如何在python

if some_condition_that_evals_to_True: 
    raise ValueError("Error message") 

我想要做的是插入記錄語句日誌這整個例外,但這樣做只是這樣不僅節省了記錄消息:

if some_condition_that_evals_to_True: 
    logger.error("Logged error message") 
    raise ValueError("Error message") 

任何一個知道如何保存包括ValueError異常整個錯誤消息?

編輯:

下面是什麼,我試圖重新:

if some_condition_that_evals_to_True: 
    try: 
     raise ValueError("Error with value") 
    except ValueError: 
     logger.exception("Logging Error with Value") 
     raise 

但是,這似乎是一種迂迴的方式來獲得我想要的行爲,所以另一種方式來短語我的問題:有一種更優雅的方式獲得與上述代碼塊相同的行爲?

+2

什麼* *實際發生時,你試過嗎?顯示實際的輸出,以及它與你想要的不同。簡而言之,不要問*我們*它是否會工作,請問最終權威人士:您的Python運行時系統。 :-) – Prune

+0

@Prune試了一下,並得到了預期的結果,我編輯說明,以反映 – K4n3

+1

偉大的。嘗試'ValueError'的異常處理程序並記錄你喜歡的內容。這對你有用嗎? – Prune

回答

1

使用logging module時嘗試stack_info關鍵字參數:

import logging 
logging.basicConfig(filename='example.log',level=logging.DEBUG) 
if True: 
    logging.error('Error Message', stack_info=True) 
    raise ValueError('Custom Error Message') 

運行這說明如下:

J:\>python log_stack.py 
Traceback (most recent call last): 
    File "log_stack.py", line 5, in <module> 
    raise ValueError('Custom Error Message') 
ValueError: Custom Error Message 

J:\>more example.log 
ERROR:root:Error Message 
Stack (most recent call last): 
    File "log_stack.py", line 4, in <module> 
    logging.error('Error Message', stack_info=True) 
+0

這幾乎就是我所希望的。有沒有一種方法記錄ValueError是導致錯誤的原因?本質上只是記錄打印的內容 – K4n3

+2

@Abdullah'ValueError'不會導致錯誤,'ValueError'僅僅是通知其他代碼特定錯誤類型的機制。您的日誌消息應該爲人類提供信息,因此像「'foo'%foo'的無效值%r之類的日誌消息應該能夠爲您提供所需的所有信息。 – deceze

+0

@Abdullah你可以實例化一個例外,例如'e = ValueError('custom')',然後使用'logging.exception(e,stack_info = True)'記錄日誌,但是文檔說只能從異常處理程序調用(我不知道具體原因),這就是爲什麼我沒有在上面使用它。它在我們微不足道的例子中起作用。 – Eric