获取警告的回溯

2024-04-25

在 numpy 中我们可以做np.seterr(invalid='raise') http://docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html获取引发错误的警告的回溯(请参阅这个帖子 https://stackoverflow.com/questions/4190817/tracing-python-warnings-errors-to-a-line-number-in-numpy-and-scipy).

  • 有追踪警告的通用方法吗?
  • 当发出警告时,我可以让 python 进行回溯吗?

你可以通过分配来得到你想要的warnings.showwarning. The 警告模块文档 https://docs.python.org/3/library/warnings.html#warnings.showwarning它本身建议你这样做,所以这并不是说你受到了诱惑源头的阴暗面. :)

您可以通过分配给替代实现来替换此函数warnings.showwarning.

您可以定义一个新函数来执行以下操作warning.showwarning通常情况下,它还会打印堆栈。然后你将它代替原来的:

import traceback
import warnings
import sys

def warn_with_traceback(message, category, filename, lineno, file=None, line=None):

    log = file if hasattr(file,'write') else sys.stderr
    traceback.print_stack(file=log)
    log.write(warnings.formatwarning(message, category, filename, lineno, line))

warnings.showwarning = warn_with_traceback

此后,每个警告都会打印堆栈跟踪以及警告消息。但请考虑到,如果由于不是第一个警告而忽略警告,则不会发生任何事情,因此您仍然需要执行:

warnings.simplefilter("always")

您可以获得与该类似的控件numpy.seterr给出通过warning模块的过滤器

如果你想要的是 python 在每次触发时报告每个警告,而不仅仅是第一次,你可以包括类似的内容:

import warnings
warnings.simplefilter("always")

您可以通过传递不同的字符串作为参数来获得其他行为。使用相同的函数,您还可以指定不同的警告行为,具体取决于引发警告的模块、它们提供的消息、警告类、导致警告的代码行等等...

您可以在列表中查看模块文档 http://docs.python.org/3/library/warnings.html#the-warnings-filter

例如,您可以设置所有警告以引发异常,除了DeprecationWarnings应该完全忽略:

import warnings
warnings.simplefilter("error")
warnings.simplefilter("ignore", DeprecationWarning)

通过这种方式,您可以获得作为错误引发的每个警告的完整回溯(只有第一个警告,因为执行将停止......但您可以逐个解决它们,并创建一个过滤器来忽略您不想听到的警告又关于...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取警告的回溯 的相关文章

随机推荐