欢迎光临散文网 会员登陆 & 注册

python 警告捕获(RuntimeWarning Catch)

2023-06-05 22:47 作者:游戏王luffy  | 我要投稿

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


python 警告捕获(RuntimeWarning Catch)的评论 (共 条)

分享到微博请遵守国家法律