Python 2和3中嵌套异常处理程序中不带参数的"raise"范围

a3n*_*3nm 6 python scope exception python-2.7 python-3.x

请考虑以下最小示例:

try:
  raise Exception('foo')
except Exception:
  try:
    raise Exception('bar')
  except Exception:
    pass
  raise 
Run Code Online (Sandbox Code Playgroud)

使用Python 2运行此代码会引发异常栏,使用Python 3运行它会引发异常foo.然而,Python 2Python 3的文档都指出,raise没有表达式会引发"当前作用域中活动的最后一个异常".为什么Python 2和3中的范围不同?差异记录在哪里?

Eth*_*man 2

范围不同,因为 Python 3 更高级。:)

for 的范围bar从缩进的 开始,到其子句(或子句,如果有的话)try中的最后一个语句之后结束;裸露的内容显然在该节中,这就是重新加注的内容。exceptfinallyraisefoo except

这是 Python 3 中修复的小问题之一。不过,文档可能会更清晰。