我正在处理如何在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
我希望能够测试是否已经通过unittest测试了它的警告。如果我只是打印出来的消息,我就无法在unittest中使用assertRaises进行测试。
答案 0 :(得分:206)
import warnings
warnings.warn("Warning...........Message")
请参阅python文档:here
答案 1 :(得分:100)
您不应该raise
警告,您应该使用warnings
模块。通过提高它,你会产生错误,而不是警告。
答案 2 :(得分:24)
默认情况下,与异常不同,警告不会中断。
在import warnings
之后,可以在生成警告时指定Warnings类。如果未指定,则默认情况下为UserWarning
。
>>> warnings.warn('This is my lazy warning.')
<string>:1: UserWarning: This is my lazy warning.
简单地使用预先存在的类,例如Warning
:
>>> warnings.warn('This is my generic warning.', Warning)
<string>:1: Warning: This is my generic 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 ,警告,错误等级别的消息。 警告或更高级别默认情况下打印到stderr。