Python 怎麼捕獲警告?(注意:不是捕獲異常)

1. 警告不是異常

你是否是常常在使用一些系統庫或者第三方模塊的時候,會出現一些既不是異常也不是錯誤的警告信息?python

這些警告信息,有時候很是多,對於新手容易形成一些誤判,覺得是程序出錯了。shell

實則否則,異常和錯誤,都是程序出現了一些問題,可是警告不一樣,他的緊急程度很是之低,以至於大多數的警告都是能夠直接忽略的。bash

若是不想顯示這些告警信息,能夠直接加上參數 -W ignore 參數,就不會再顯示了。markdown

2. 警告能捕獲嗎

能捕獲的只有錯誤異常,可是經過一系列的操做後,你能夠將這些警告轉化爲異常。oop

這樣一來,你就能夠像異常同樣去捕獲他們了。ui

在不進行任何設置的狀況下,警告會直接打印在終端上。spa

3. 捕獲警告方法一

在 warnings 中有一系列的過濾器。code

處置
"default" 爲發出警告的每一個位置(模塊+行號)打印第一個匹配警告
"error" 將匹配警告轉換爲異常
"ignore" 從不打印匹配的警告
"always" 老是打印匹配的警告
"module" 爲發出警告的每一個模塊打印第一次匹配警告(不管行號如何)
"once" 不管位置如何,僅打印第一次出現的匹配警告

當你指定爲 error 的時候,就會將匹配警告轉換爲異常。orm

以後你就能夠經過異常的方式去捕獲警告了。教程

import warnings
warnings.filterwarnings('error')    

try:
    warnings.warn("deprecated", DeprecationWarning)
except Warning as e:
    print(e)
複製代碼

運行後,效果以下

4. 捕獲警告方法二

若是你不想對在代碼中去配置將警告轉成異常。

import warnings

try:
    warnings.warn("deprecated", DeprecationWarning)
except Warning as e:
    print(e)
複製代碼

能夠在執行的時候,只要加上一個參數 -W error ,就能夠實現同樣的效果

$ python3 -W error demo.py
deprecated
複製代碼

5. 捕獲警告方法三

除了上面的方法以外 ,warnings 還自帶了個捕獲警告的上下文管理器。

當你加上 record=True 它會返回一個列表,列表裏存放的是全部捕獲到的警告,我將它賦值爲 w,而後就能夠將它打印出來了。

import warnings

def do_warning():
    warnings.warn("deprecated", DeprecationWarning)

with warnings.catch_warnings(record=True) as w:
    do_warning()
    if len(w) >0:
        print(w[0].message)
複製代碼

運行後,效果以下


文章最後給你們介紹三個我本身寫的在線文檔:

第一個文檔PyCharm 中文指南 1.0 文檔

花了兩個多月的時間,整理了 100 個 PyCharm 的使用技巧,爲了讓新手可以直接上手,我花了不少的時間錄製了上百張 GIF 動圖,有興趣的前往在線文檔閱讀。

第二個文檔PyCharm 黑魔法指南 1.0 文檔

系統收錄各類 Python 冷門知識,Python Shell 的多樣玩法,使人瘋狂的 Python 炫技操做,Python 的超詳細進階知識解讀,很是實用的 Python 開發技巧等。

第三個文檔Python 中文指南 1.0 文檔

花了三個月時間寫的一本 適合零基礎入門 Python 的全中文教程,搭配大量的代碼案例,讓初學者對 代碼的運做效果有一個直觀感覺,教程既有深度又有廣度,每篇文章都會標內容的難度,是基礎仍是進階的,可供讀者進行選擇,是一本可貴的 Python 中文電子教程。

相關文章
相關標籤/搜索