Python';提高';没有争论:什么是;在当前范围内处于活动状态的最后一个异常";?

Python';提高';没有争论:什么是;在当前范围内处于活动状态的最后一个异常";?,python,python-3.x,python-2.7,exception,raise,Python,Python 3.x,Python 2.7,Exception,Raise,Python的文档说: 如果不存在表达式,raise将重新引发当前范围内活动的最后一个异常 (Python 3:;Python 2.7:) 然而,“最后一次活动”的概念似乎已经改变。见证以下代码示例: # 来自未来导入打印功能 导入系统 打印('Python version=',sys.version) 尝试: 引发异常('预期') 除: 尝试: 引发异常(“意外”) 除: 通过 raise#重新引发Python2无法预料的事件,而Python3需要重新引发 这导致了我在Python 2中没有

Python的文档说:

如果不存在表达式,
raise
将重新引发当前范围内活动的最后一个异常

(Python 3:;Python 2.7:)

然而,“最后一次活动”的概念似乎已经改变。见证以下代码示例:

#
来自未来导入打印功能
导入系统
打印('Python version=',sys.version)
尝试:
引发异常('预期')
除:
尝试:
引发异常(“意外”)
除:
通过
raise#重新引发Python2无法预料的事件,而Python3需要重新引发
这导致了我在Python 2中没有预料到的结果:

Python version = 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)]
Traceback (most recent call last):
  File "./x", line 10, in <module>
    raise Exception('UNEXPECTED')
Exception: UNEXPECTED
然后,Python 2也开始工作了:

Python version = 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)]
Traceback (most recent call last):
  File "./x", line 13, in <module>
    raise Exception('EXPECTED')
Exception: EXPECTED
Python版本=2.7.15(v2.7.15:ca079a3ea3,2018年4月30日,16:30:26)[MSC v.1500 64位(AMD64)] 回溯(最近一次呼叫最后一次): 文件“/x”,第13行,在 引发异常('预期') 例外情况:预期
我正在考虑切换到…

raise
使用与
sys.exc_info
相同的信息,这些信息包含文档。由于您的解决方案所利用的每帧行为都有文档记录,所以这就是解决方法


除语句外,对
语句进行了几处更改。我相信它包括了这一个,但唯一明确提到的是,当离开
时,
存储为
的异常被丢弃,除了
Python 2行为与其说是一个bug,不如说是一个设计缺陷。Python3.0通过添加异常链接特性解决了这个问题。最接近这种变化的文档可以在动机中找到:

在处理一个异常(异常A)的过程中,可能会发生另一个异常(异常B)。在今天的Python(版本2.4)中,如果发生这种情况,异常B将向外传播,异常A将丢失

这正是您在2.7中看到的:预期(A)丢失,因为意外(B)出现并重写了它。使用Python3中较新的异常链接功能,可以通过异常实例上的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
属性来保留这两个错误的完整上下文

对于更直接的交叉兼容解决方案,我建议您手动保留引用,明确显示正在重新引发的错误,并像往常一样避免使用裸露的
,除了
语句(它们总是太宽):


如果您希望以交叉兼容的方式抑制异常链接功能,您可以通过在重新引发之前设置
err\u expected.\uu原因\uuu=None

相关:此PEP 3110与OP问题基本无关。当离开except块时,异常的丢弃是关于处理新的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu属性引起的
异常->回溯->堆栈帧->异常
引用周期。@wim:嗯,行为似乎已被r62847更改,但我还没有找到可能是什么(其他?)PEP。
Python version = 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)]
Traceback (most recent call last):
  File "./x", line 7, in <module>
    raise Exception('EXPECTED')
Exception: EXPECTED
Python version = 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)]
Traceback (most recent call last):
  File "./x", line 13, in <module>
    raise Exception('EXPECTED')
Exception: EXPECTED
try:
    raise Exception('EXPECTED')
except Exception as err_expected:
    try:
        raise Exception('UNEXPECTED')
    except Exception as err_unexpected:
        pass
    raise err_expected