Python 2和3中捕获的异常实例的范围

Chr*_*nds 8 python scope exception python-2.7 python-3.x

由于Python中的变量是其循环和外访问try- except块,我天真地以为下面这个代码片段会工作得很好,因为e是访问:

try:
    int('s')
except ValueError as e:
    pass
print(e)
Run Code Online (Sandbox Code Playgroud)

在Python 2(2.7测试)中,它确实按预期工作,输出为:

invalid literal for int() with base 10: 's'
Run Code Online (Sandbox Code Playgroud)

但是,在Python 3中,我很惊讶输出是:

NameError: name 'e' is not defined
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

Chr*_*nds 10

我后来找到了答案,因为PEP 3110解释说,在Python 3中,在except套件的末尾删除了被捕获的名称,以实现更高效的垃圾收集.如果您希望避免这种情况,还有推荐的语法:

有必要将异常实例保留在除套件末尾之外的情况可以像这样轻松转换

try:
    ...
except E as N:
    ...
...
Run Code Online (Sandbox Code Playgroud)

try:
    ...
except E as N:
    n = N
    ...
…
Run Code Online (Sandbox Code Playgroud)

这样,当在块的末尾删除N时,n将保持并且可以正常使用.