在Python中不打断程序的情况下发出警告
我想在Python中发出一个警告,但不想让程序崩溃、停止或中断。
我用一个简单的函数来检查用户传入的数字是否为非零。如果是的话,程序应该给他们一个警告,但要继续正常运行。这个功能应该像下面的代码那样,但我希望使用类 Warning()
、Error()
或 Exception()
,而不是手动打印警告信息。
def is_zero(i):
if i != 0:
print "OK"
else:
print "WARNING: the input is 0!"
return i
如果我使用下面的代码并传入0,程序就会崩溃,值也不会被返回。相反,我希望程序能够正常继续运行,并只是通知用户他们传入了0。
def is_zero(i):
if i != 0:
print "OK"
else:
raise Warning("the input is 0!")
return i
我还希望能够通过单元测试来检查是否抛出了警告。如果我只是打印出消息,就无法在单元测试中用assertRaises来测试它。
4 个回答
116
默认情况下,警告不会像异常那样中断程序的运行。
在使用 import warnings
之后,你可以在发出警告时指定一个 警告类。如果不指定,默认的就是 UserWarning
。
>>> warnings.warn('This is a default warning.')
<string>:1: UserWarning: This is a default warning.
如果你想简单地使用一个已有的类,比如 DeprecationWarning
,可以这样做:
>>> warnings.warn('This is a particular warning.', DeprecationWarning)
<string>:1: DeprecationWarning: This is a particular warning.
创建一个自定义的警告类和创建一个自定义的异常类很相似:
>>> class MyCustomWarning(UserWarning):
... pass
...
... warnings.warn('This is my custom warning.', MyCustomWarning)
<string>:1: MyCustomWarning: This is my custom warning.
在测试时,可以考虑使用 assertWarns
或 assertWarnsRegex
。
另外,特别是对于独立应用程序,可以考虑使用 logging
模块。它可以记录不同级别的消息,比如 debug、info、warning、error 等等。默认情况下,级别为 warning 或更高的日志消息会被打印到错误输出中。
578
import warnings
warnings.warn("Warning...........Message")
查看Python的文档:点击这里
263
你不应该直接raise
警告,而是应该使用warnings
这个模块。直接抛出警告会产生错误,而不是简单的警告信息。