2010-10-08 61 views
79

我正在處理如何在Python中引發警告而不必讓程序崩潰/停止/中斷的問題。如何在不停止(中斷)程序的情況下在Python中發出警告?

我使用以下簡單的函數,只檢查用戶傳遞給它的非零數字。如果用戶傳遞零,程序應警告用戶,但正常繼續。它應該像下面的代碼一樣工作,但應該使用類Warning(),Error()或Exception(),而不是手動輸出警告。

def isZero(i): 
    if i != 0: 
    print "OK" 
    else: 
    print "WARNING: the input is 0!" 
    return i 

如果我使用下面的代碼並將0傳遞給該函數,程序崩潰並且該值永遠不會返回。相反,我想讓程序正常繼續,只是通知用戶他將0傳遞給函數。

def isZero(i): 
    if i != 0: 
    print "OK" 
    else: 
    raise Warning("the input is 0!") 
    return i 

的一點是,我希望能夠測試警告已通過拋出單元測試測試它。如果我只是簡單地打印這條消息,我不能用unittest中的assertRaises來測試它。

謝謝,托馬斯

+0

究竟是如何做的,你要通知用戶?通過電子郵件或短信?因爲可以被連接起來,但你需要具體。 – aaronasterling 2010-10-08 15:05:07

+1

你爲什麼不直接'打印'信息? – sje397 2010-10-08 15:06:32

+1

@ sje397關鍵是我希望能夠測試一個警告已經被unittest測試過。如果我只是簡單地打印出來的信息,我不能用unittest中的assertRaises來做到這一點。 – 2010-10-08 15:16:56

回答

68

你不應該raise警告,你應該使用warnings模塊。通過提高它,你會產生錯誤,而不是警告。

+1

非常感謝。那麼我怎樣才能測試使用unittest引發的警告?我不能再使用assertRaises()。 – 2010-10-08 15:14:42

+0

@Tomas Novotny你可以捕獲stdout和stderr,然後檢查你的警告發出的字符串是否在其中。 – wheaties 2010-10-08 15:33:09

+10

@Tomas:我從來沒有聽說過測試警告的願望,但有一個['warnings.catch_warnings'](http://docs.python.org/library/warnings.html#warnings.catch_warnings)上下文管理器會讓你做到這一點。 – SilentGhost 2010-10-08 15:33:21

139
import warnings 
warnings.warn("Warning...........Message") 

請參見Python文檔:here

+0

這應該是答案。示例殺死鏈接到文檔。 – 2018-01-11 20:01:18

相關問題