【问题标题】:Raise warning in Python without interrupting program在不中断程序的情况下在 Python 中发出警告
【发布时间】:2011-04-22 22:50:08
【问题描述】:

我正在尝试在 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 中使用 assertRaises 对其进行测试。

【问题讨论】:

  • 您究竟想如何通知用户?通过电子邮件或短信?因为可以连接,但你需要具体。
  • 你为什么不直接print这个消息?
  • @sje397 关键是我希望能够测试单元测试是否已抛出警告。如果我只是将消息打印出来,我无法在 unittest 中使用 assertRaises 来做到这一点。

标签: python exception error-handling warnings


【解决方案1】:

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

import warnings 之后,可以在生成警告时指定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 或更高级别默认打印到 stderr。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 非常感谢。然后我如何测试使用 unittest 是否已抛出警告?我不能再使用 assertRaises() 了。
    • @Tomas Novotny 您可以捕获标准输出和标准错误,然后检查您的警告发出的字符串是否在其中找到。
    • @Tomas:我从来没有听说过测试警告的愿望,但是有一个warnings.catch_warnings 上下文管理器可以让你这样做。
    • @SilentGhost 如果它在你的代码中,你想测试它,不是吗? docs.pytest.org/en/6.2.x/warnings.html#warns(公平地说,评论已经超过 10 年了)
    【解决方案3】:
    import warnings
    warnings.warn("Warning...........Message")
    

    查看python文档:here

    【讨论】:

    • warnings.warn("blabla", DeprecationWarning) 用于向正在发出的警告类型添加一个类
    猜你喜欢
    • 2016-05-26
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 2020-10-21
    • 2018-03-19
    相关资源
    最近更新 更多