在不中断程序的情况下在Python中引发警告

时间:2010-10-08 15:01:59

标签: python exception-handling error-handling warnings

我正在处理如何在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进行测试。

3 个答案:

答案 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.

如需测试,请考虑assertWarnsassertWarnsRegex

作为替代方案,尤其是对于独立应用程序,请考虑logging模块。它可以记录具有 debug info 警告错误等级别的消息。 警告或更高级别默认情况下打印到stderr。