【问题标题】:Is it possible to capture all warnings raised in a try block in python?是否可以捕获 python 中的 try 块中引发的所有警告?
【发布时间】:2019-08-24 14:25:42
【问题描述】:

我有一些代码大致如下:

from logging import warning

def complex_function():
    # Do some stuff
    raise Warning("blah") 
    # Do some more stuff
    raise Warning("Blah again") 

try: 
    complex_function()
except Warning as e: 
    warning(e) 

这会导致:

WARNING:root:blah

我想捕获所有引发的警告,并将它们记录下来。在我的代码中,此类警告有时来自 3rd 方库,因此修改警告以使用 logging.warning 是不切实际的,我还想存储警告信息,以便我可以通过返回该信息的某些版本一个 API。

有没有办法让我做这样的事情来捕获所有警告并循环它们?

编辑

太晚了,我意识到我在上面的例子中提出了错误的警告,complex_function 应该是这样的:

def complex_function():
    # Do some stuff
    warnings.warn("blah") 
    # Do some more stuff
    warnings.warn("Blah again", UnknownWarningType)

我想我可以用 warnings.catch_warnings 捕捉这些

【问题讨论】:

  • 我认为 try catch 会在第一个警告/错误时中断。你可能想看看这篇文章:stackoverflow.com/questions/5644836/…
  • 我猜你可以 yield 警告代替。
  • 警告不是要中断执行流程吗?如果不是,你不应该养它们。您可以将列表作为参数传递以填充警告,或返回警告列表。
  • 你说得对,@PeterWood,我忘记了加注和跟注warnings.warn 之间的区别。我添加了一个澄清,我将关闭这个问题。对不起,大雁追逐,感谢您的帮助。

标签: python exception logging warnings


【解决方案1】:

您是否期待以下内容:

import warnings
warnings.filterwarnings('error')


def warning_func():
    print('hello')
    warnings.warn(Warning('Warn1'))
    print('hi')
    warnings.warn(Warning('Warn2'))


with warnings.catch_warnings(record=True) as w:
    warnings.simplefilter("always")
    warning_func()
    print(w)

【讨论】:

  • 没有。这仅捕获第一个异常,与我在问题中的示例相同。
  • 请您检查一下修改后的解决方案。
  • 我不认为它会起作用,因为我不一定知道警告会是什么类型 - 它可能是来自 numpy 的 RuntimeWarning,或者它可能完全是其他东西。
  • 回到这一点,这似乎完全符合我的需要。不过,我认为您不需要 warnings.warn() 中的 Warning() - 只需一条消息即可。而且我无法弄清楚 warnings.simplefilter 在做什么 - 没有它就无法工作,但函数文档并没有真正说明原因......
猜你喜欢
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 2018-02-02
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多