从警告链接异常时发生TypeError



我正试图通过应用warnings.simplefilter'error'筛选器来捕获作为错误引发的警告。下面给出了一个最小的工作示例:

>>> import warnings
>>> warnings.simplefilter('error')
>>> try:
...     warnings.warn('test')
... except UserWarning:
...     raise ValueError
...
ValueError: 

这很好,但如果我想将其链接起来,以便包含来自警告的回溯,我会得到以下TypeError:

>>> import sys
>>> try:
...     warnings.warn('test')
... except UserWarning:
...     raise ValueError from sys.exc_info()[2]
...
TypeError: exception causes must derive from BaseException

看起来,即使我正在提升一个从BaseException派生的类(即ValueError),来自UserWarning的回溯的信息似乎在诱使Python认为我仍在提升UserWarning

这是预期的行为吗?如果是,是否有一个好的解决方法?

我使用的是Python 3.4.3。

您正试图使用回溯对象作为异常:

raise ValueError from sys.exc_info()[2]

CCD_ 8返回一个CCD_;这里需要索引1(记住Python计算0的索引!):

raise ValueError from sys.exc_info()[1]

更好的是,直接在变量中捕获异常实例:

try:
    warnings.warn('test')
except UserWarning as warning:
    raise ValueError from warning

这样就不必计算元组索引了。

将警告筛选器设置为'error'时,异常是Warning异常类的子类,该类继承自Exception,请参阅异常层次结构部分。

最新更新