Python 模块 warnings-发送非严重错误

Python 模块 warnings-发送非严重错误

模块 warnings 在程序运行中,向用户报告非严重错误,它是由 Python 3.0 版本引入的。使用的情况包括向库调用者警告一些函数将来可能废弃,或者提示一些错误的配置信息,不支持的特性等等。

因为报告的不是严重的错误,一个程序可能会遇到多个重复的问题。warnings 可以抑制重复的错误信息,使你不用多次看到他们。方法是可以通过命令行传递参数或者调用 warnings 内的函数。

类别和过滤操作


warnings 可以扩展内置的基类 Warning 来分类,可以查看模块 exceptions 了解详情。

warnings 还可以通过设置过滤修改模块内部的行为,包含6种操作:

  • error 把警告转换为异常
  • ignore 忽略警告
  • always 总是发出警告
  • default 在每个位置打印警告
  • module 在每个模块打印警告
  • once 只打印一次

生成 warnings


最简单的生成 warning 是调用 warn() 函数,传递的参数为消息内容。

Python 模块 warnings-发送非严重错误

执行:

Python 模块 warnings-发送非严重错误

可以看到,虽然 warning 调用了,但是程序还是继续往下运行,默认的行为会继续运行下去。可以调用函数 simplefilter() 改变这种行为。

Python 模块 warnings-发送非严重错误

执行:

Python 模块 warnings-发送非严重错误

在这个例子中,使用 simplefilter() 函数告诉 warnings 模块内部当发生警告 UserWarning 时,触发异常。查看输出,最后打印数据的语句没有执行,程序中途停止运行了。

也可以使用命令行传递参数达到同样的效果。

Python 模块 warnings-发送非严重错误

模式匹配过滤


还可以通过函数 filterwarnings() 过滤更复杂的匹配,例如设定一个正则表达式过滤消息内容。

Python 模块 warnings-发送非严重错误

执行:

Python 模块 warnings-发送非严重错误

本例忽略包含 hello 消息的警告,还可以通过命令行修改过滤行为,查看下面的例子。

Python 模块 warnings-发送非严重错误

执行:

Python 模块 warnings-发送非严重错误

重复的警告


默认大部分的警告只在触发的位置打印一次,请看下面的例子。

Python 模块 warnings-发送非严重错误

执行:

Python 模块 warnings-发送非严重错误

下面的例子会打印两次,因为他们触发的位置不一样。

Python 模块 warnings-发送非严重错误

执行:

Python 模块 warnings-发送非严重错误

可以通过 simplefilter() 改变这种行为,使得不同位置相同的消息内容只警告一次。

Python 模块 warnings-发送非严重错误

执行:

Python 模块 warnings-发送非严重错误

改变消息输出位置


正常情况下,警告消息输出到 sys.stderr。可以通过修改模块函数 showwarning() 覆盖默认的行为。下面的代码,重定向消息到日志模块。

Python 模块 warnings-发送非严重错误

执行:

Python 模块 warnings-发送非严重错误

格式化消息


如果想自定义消息格式,可以修改模块函数 formatwarning()

Python 模块 warnings-发送非严重错误

执行:

Python 模块 warnings-发送非严重错误


分享到:


相關文章: