python 警告捕獲(RuntimeWarning Catch)

1.背景
python腳本中,我們經(jīng)常會使用try-except異常處理機制,來捕獲和處理程序執(zhí)行過程中可能出現(xiàn)的錯誤和異常情況。但是,我們也會在執(zhí)行python腳本的過程遇到RuntimeWarning的錯誤,例如,使用pandas讀取表格中的內(nèi)容,并轉(zhuǎn)換到基本python類型,如果表格內(nèi)容為nan,會提示以下警告。

此外,numpy中出現(xiàn)/0時,會發(fā)現(xiàn)應(yīng)該捕獲除0異常的地方,卻沒有拋出異常(numpy自身機制處理,不拋出異常),程序反而”正?!皥?zhí)行下去。
如以下程序:

(除0結(jié)果是nan,沒有拋出異常,只提示了警告)

(將nan轉(zhuǎn)換為int,顯示警告,但不影響程序執(zhí)行)
因此,有時候我們也需要捕獲這些警告,幫助我們查找問題或者避免意想不到的問題。
2.處理方法
(1)if判斷
像在numpy中,可以使用np.isnan判斷是否為空等
(2)numpy.seterr
通過seterr可以設(shè)置各種數(shù)字異常時的處理行為,
數(shù)字異常包括:
●?all:所有數(shù)字異常
●?under:浮點數(shù)下溢
●?invalid:無效,無效生成nan時
●?divide:除以0
●?over:浮點溢出
異常處理行為如下:
●?'ignore':發(fā)生異常時不采取任何措施。
●?'warn':打印?RuntimeWarning?(通過Python?warnings模塊)。
●?'raise':引發(fā)?FloatingPointError?。
●?'call':調(diào)用使用?seterrcall?函數(shù)指定的函數(shù)。
●?'print':直接打印警告stdout。
●?'log':在?seterrcall?指定的Log對象中記錄錯誤。
因此,使用seterr時,可以設(shè)置為”raise“,并通過try-excep來捕獲異常處理。如以下代碼

(3)warnings模塊
使用warnings模塊+try-except可以捕獲python中的所有警告,并進行異常處理。
warnings使用filterwarnings過濾器來處理警告:

注意的是,seterr僅適用numpy,而warnings不限制模塊。如下代碼所示(此時不用設(shè)置seterr,因為默認(rèn)處理方法就是warning)
3.? 參考資料
https://blog.csdn.net/TeFuirnever/article/details/94122670
https://www.jianshu.com/p/907107c7173d
https://stackoverflow.com/questions/15933741/how-do-i-catch-a-numpy-warning-like-its-an-exception-not-just-for-testing