5.28 如何捕获警告?(注意不是捕获异常) ==================================== 1. 警告不是异常 --------------- 你是不是经常在使用一些系统库或者第三方模块的时候,会出现一些既不是异常也不是错误的警告信息? 这些警告信息,有时候非常多,对于新手容易造成一些误判,以为是程序出错了。 实则不然,异常和错误,都是程序出现了一些问题,但是警告不同,他的紧急程度非常之低,以致于大多数的警告都是可以直接忽略的。 如果不想显示这些告警信息,可以直接加上参数 ``-W ignore`` 参数,就不会再显示了。 2. 警告能捕获吗 --------------- 能捕获的只有错误异常,但是通过一系列的操作后,你可以将这些警告转化为异常。 这样一来,你就可以像异常一样去捕获他们了。 在不进行任何设置的情况下,警告会直接打印在终端上。 .. image:: http://image.iswbm.com/20210313143425.png 3. 捕获警告方法一 ----------------- 在 warnings 中有一系列的过滤器。 ============= ====================================================== 值 处置 ============= ====================================================== ``"default"`` 为发出警告的每个位置(模块+行号)打印第一个匹配警告 ``"error"`` 将匹配警告转换为异常 ``"ignore"`` 从不打印匹配的警告 ``"always"`` 总是打印匹配的警告 ``"module"`` 为发出警告的每个模块打印第一次匹配警告(无论行号如何) ``"once"`` 无论位置如何,仅打印第一次出现的匹配警告 ============= ====================================================== 当你指定为 error 的时候,就会将匹配警告转换为异常。 之后你就可以通过异常的方式去捕获警告了。 .. code:: python import warnings warnings.filterwarnings('error') try: warnings.warn("deprecated", DeprecationWarning) except Warning as e: print(e) 运行后,效果如下 .. image:: http://image.iswbm.com/20210313144501.png 4. 捕获警告方法二 ----------------- 如果你不想对在代码中去配置将警告转成异常。 .. code:: python import warnings try: warnings.warn("deprecated", DeprecationWarning) except Warning as e: print(e) 可以在执行的时候,只要加上一个参数 ``-W error`` ,就可以实现一样的效果 .. code:: shell $ python3 -W error demo.py deprecated 5. 捕获警告方法三 ----------------- 除了上面的方法之外 ,warnings 还自带了个捕获警告的上下文管理器。 当你加上 ``record=True`` 它会返回一个列表,列表里存放的是所有捕获到的警告,我将它赋值为 ``w``\ ,然后就可以将它打印出来了。 .. code:: python 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) 运行后,效果如下 .. image:: http://image.iswbm.com/20210313144751.png