获取警告的回溯

新手上路,请多包涵

在 numpy 中,我们可以做 np.seterr(invalid='raise') 来获取引发错误的警告的回溯(参见 这篇文章)。

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

原文由 embert 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 499
2 个回答

您可以通过分配给 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")

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

您可以查看 模块文档 中的列表

例如,您可以将所有警告设置为引发异常,但应完全忽略的 DeprecationWarnings 除外:

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

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

原文由 mgab 发布,翻译遵循 CC BY-SA 4.0 许可协议

像这样运行你的程序

python -W error myprogram.py

这会使所有警告都致命,请参阅 此处 以获取更多信息

原文由 Jakob Bowyer 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题