python 警告捕获(RuntimeWarning Catch)

1.背景
python脚本中,我们经常会使用try-except异常处理机制,来捕获和处理程序执行过程中可能出现的错误和异常情况。但是,我们也会在执行python脚本的过程遇到RuntimeWarning的错误,例如,使用pandas读取表格中的内容,并转换到基本python类型,如果表格内容为nan,会提示以下警告。

此外,numpy中出现/0时,会发现应该捕获除0异常的地方,却没有抛出异常(numpy自身机制处理,不抛出异常),程序反而”正常“执行下去。
如以下程序:

(除0结果是nan,没有抛出异常,只提示了警告)

(将nan转换为int,显示警告,但不影响程序执行)
因此,有时候我们也需要捕获这些警告,帮助我们查找问题或者避免意想不到的问题。
2.处理方法
(1)if判断
像在numpy中,可以使用np.isnan判断是否为空等
(2)numpy.seterr
通过seterr可以设置各种数字异常时的处理行为,
数字异常包括:
● all:所有数字异常
● under:浮点数下溢
● invalid:无效,无效生成nan时
● divide:除以0
● over:浮点溢出
异常处理行为如下:
● 'ignore':发生异常时不采取任何措施。
● 'warn':打印 RuntimeWarning (通过Python warnings模块)。
● 'raise':引发 FloatingPointError 。
● 'call':调用使用 seterrcall 函数指定的函数。
● 'print':直接打印警告stdout。
● 'log':在 seterrcall 指定的Log对象中记录错误。
因此,使用seterr时,可以设置为”raise“,并通过try-excep来捕获异常处理。如以下代码

(3)warnings模块
使用warnings模块+try-except可以捕获python中的所有警告,并进行异常处理。
warnings使用filterwarnings过滤器来处理警告:

注意的是,seterr仅适用numpy,而warnings不限制模块。如下代码所示(此时不用设置seterr,因为默认处理方法就是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