获取警告的回溯

时间:2014-03-13 09:16:11

标签: python warnings traceback

在numpy中我们可以执行np.seterr(invalid='raise')来获取引发错误的警告(请参阅this post)。

  • 是否有跟踪警告的一般方法?
  • 当发出警告时,我可以让python进行追溯吗?

3 个答案:

答案 0 :(得分:53)

您可以通过分配到warnings.showwarning来获得所需内容。 warnings module documentation本身建议你这样做,所以并不是因为暗源而受到诱惑。 :)

  

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

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

您可以查看module documentation

中的列表

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

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

通过这种方式,您可以获得每个警告引发的错误的完整追溯(只有第一个,因为执行将停止......但您可以逐个解决这些问题,并创建一个过滤器来忽略您不会发现的错误#39 ;我想再次听到......

答案 1 :(得分:14)

运行您的程序,如

python -W error myprogram.py

这会使所有警告都致命,有关详细信息,请参阅here

答案 2 :(得分:1)

您可以使用warnings.filterwarnings()将选定的警告转换为异常并按以下方式进行追溯:

CancellationChangeToken