获取警告的追溯

发布于 2021-01-29 18:59:29

在numpy中,我们可以np.seterr(invalid='raise')获取对引发错误的警告的回溯。

  • 是否有跟踪警告的一般方法?
  • 发出警告时,我可以使python进行追溯吗?
关注者
0
被浏览
34
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    通过分配给,您可以获得想要的东西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)
    

    这样,您可以对引发为错误的每个警告进行完整的追溯(只有第一个警告,因为执行将停止…但是您可以一个个地解决它们,并创建一个过滤器以忽略那些您不想听到的警告大约…



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看