考虑以下最小示例:
try:
raise Exception('foo')
except Exception:
try:
raise Exception('bar')
except Exception:
pass
raise
使用Python 2运行此代码会引发异常条,使用Python 3运行此代码则会引发异常foo。然而,Python 2和Python 3的文档都指出,没有表达式的raise
将引发"当前范围中活动的最后一个异常"。为什么Python2和Python3的作用域不同?差异有记录吗?
作用域不同,因为Python 3更高级。:)
bar
的作用域从缩进的try
开始,在其except
子句(如果有finally
子句的话)中的最后一条语句之后结束;裸露的raise
清楚地在foo
except
节中,这就是重新评价的内容。
这是Python 3中修复的一个小问题。不过,文件可能会更清晰。