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

390 投票
4 回答
327409 浏览
提问于 2025-04-16 05:12

我想在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.

在测试时,可以考虑使用 assertWarnsassertWarnsRegex


另外,特别是对于独立应用程序,可以考虑使用 logging 模块。它可以记录不同级别的消息,比如 debuginfowarningerror 等等。默认情况下,级别为 warning 或更高的日志消息会被打印到错误输出中。

578
import warnings
warnings.warn("Warning...........Message")

查看Python的文档:点击这里

263

你不应该直接raise警告,而是应该使用warnings这个模块。直接抛出警告会产生错误,而不是简单的警告信息。

撰写回答