关于异常处理:在不中断程序的情况下在Python中引发警告

Raise warning in Python without interrupting program

我正在处理一个问题,如何在不让程序崩溃/停止/中断的情况下在python中发出警告。

我使用下面的简单函数,它只检查用户是否传递给它一个非零的数字。如果用户通过零,程序应警告用户,但正常继续。它应该像下面的代码一样工作,但是应该使用类warning()、error()或exception(),而不是手动打印警告。

1
2
3
4
5
6
def is_zero(i):
   if i != 0:
     print"OK"
   else:
     print"WARNING: the input is 0!"
   return i

如果我使用下面的代码并将0传递给函数,程序将崩溃,并且永远不会返回值。相反,我希望程序正常继续运行,并通知用户他向函数传递了0。

1
2
3
4
5
6
def is_zero(i):
   if i != 0:
     print"OK"
   else:
     raise Warning("the input is 0!")
   return i

我希望能够测试一个警告已经被抛出,通过UnitTest测试它。如果我只是打印出消息,我就不能用UnitTest中的断言引发来测试它。


1
2
import warnings
warnings.warn("Warning...........Message")

参见python文档:这里


您不应该使用raise警告,您应该使用warnings模块。通过提高它,你就产生了错误,而不是警告。


默认情况下,与异常不同,警告不会中断。

import warnings之后,可以在生成警告时指定警告类。如果未指定,则默认为"EDOCX1"〔3〕。

1
2
>>> warnings.warn('This is my lazy warning.')
<string>:1: UserWarning: This is my lazy warning.

只需使用先前存在的类,例如Warning

1
2
>>> warnings.warn('This is my generic warning.', Warning)
<string>:1: Warning: This is my generic warning.

创建自定义警告类类似于创建自定义异常类:

1
2
3
4
5
6
>>> class MyCustomWarning(UserWarning):
...     pass
...
... warnings.warn('This is my custom warning.', MyCustomWarning)

<string>:1: MyCustomWarning: This is my custom warning.

测试时,考虑使用assertWarnsassertWarnsRegex

作为另一种选择,特别是对于独立应用程序,考虑使用logging模块。它可以记录具有调试、信息、警告、错误等级别的消息。具有警告级别或更高级别的日志消息默认打印到stderr。