Python 模塊 warnings-發送非嚴重錯誤

Python 模塊 warnings-發送非嚴重錯誤

模塊 warnings 在程序運行中,向用戶報告非嚴重錯誤,它是由 Python 3.0 版本引入的。使用的情況包括向庫調用者警告一些函數將來可能廢棄,或者提示一些錯誤的配置信息,不支持的特性等等。

因為報告的不是嚴重的錯誤,一個程序可能會遇到多個重複的問題。warnings 可以抑制重複的錯誤信息,使你不用多次看到他們。方法是可以通過命令行傳遞參數或者調用 warnings 內的函數。

類別和過濾操作


warnings 可以擴展內置的基類 Warning 來分類,可以查看模塊 exceptions 瞭解詳情。

warnings 還可以通過設置過濾修改模塊內部的行為,包含6種操作:

  • error 把警告轉換為異常
  • ignore 忽略警告
  • always 總是發出警告
  • default 在每個位置打印警告
  • module 在每個模塊打印警告
  • once 只打印一次

生成 warnings


最簡單的生成 warning 是調用 warn() 函數,傳遞的參數為消息內容。

Python 模塊 warnings-發送非嚴重錯誤

執行:

Python 模塊 warnings-發送非嚴重錯誤

可以看到,雖然 warning 調用了,但是程序還是繼續往下運行,默認的行為會繼續運行下去。可以調用函數 simplefilter() 改變這種行為。

Python 模塊 warnings-發送非嚴重錯誤

執行:

Python 模塊 warnings-發送非嚴重錯誤

在這個例子中,使用 simplefilter() 函數告訴 warnings 模塊內部當發生警告 UserWarning 時,觸發異常。查看輸出,最後打印數據的語句沒有執行,程序中途停止運行了。

也可以使用命令行傳遞參數達到同樣的效果。

Python 模塊 warnings-發送非嚴重錯誤

模式匹配過濾


還可以通過函數 filterwarnings() 過濾更復雜的匹配,例如設定一個正則表達式過濾消息內容。

Python 模塊 warnings-發送非嚴重錯誤

執行:

Python 模塊 warnings-發送非嚴重錯誤

本例忽略包含 hello 消息的警告,還可以通過命令行修改過濾行為,查看下面的例子。

Python 模塊 warnings-發送非嚴重錯誤

執行:

Python 模塊 warnings-發送非嚴重錯誤

重複的警告


默認大部分的警告只在觸發的位置打印一次,請看下面的例子。

Python 模塊 warnings-發送非嚴重錯誤

執行:

Python 模塊 warnings-發送非嚴重錯誤

下面的例子會打印兩次,因為他們觸發的位置不一樣。

Python 模塊 warnings-發送非嚴重錯誤

執行:

Python 模塊 warnings-發送非嚴重錯誤

可以通過 simplefilter() 改變這種行為,使得不同位置相同的消息內容只警告一次。

Python 模塊 warnings-發送非嚴重錯誤

執行:

Python 模塊 warnings-發送非嚴重錯誤

改變消息輸出位置


正常情況下,警告消息輸出到 sys.stderr。可以通過修改模塊函數 showwarning() 覆蓋默認的行為。下面的代碼,重定向消息到日誌模塊。

Python 模塊 warnings-發送非嚴重錯誤

執行:

Python 模塊 warnings-發送非嚴重錯誤

格式化消息


如果想自定義消息格式,可以修改模塊函數 formatwarning()

Python 模塊 warnings-發送非嚴重錯誤

執行:

Python 模塊 warnings-發送非嚴重錯誤


分享到:


相關文章: