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

Python 2和3中捕获的异常实例的范围,python,python-2.7,python-3.x,exception,scope,Python,Python 2.7,Python 3.x,Exception,Scope,由于在Python中,变量可以在循环之外访问,并且除了块之外,try-,我天真地认为下面的代码片段可以很好地工作,因为e可以访问: try: int('s') except ValueError as e: pass print(e) 在Python2(2.7测试版)中,它确实按照我的预期工作,输出如下: invalid literal for int() with base 10: 's' NameError: name 'e' is not defined 然而,在Py

由于在Python中,变量可以在循环之外访问,并且除了块之外,
try
-
,我天真地认为下面的代码片段可以很好地工作,因为
e
可以访问:

try:
    int('s')
except ValueError as e:
    pass
print(e)
在Python2(2.7测试版)中,它确实按照我的预期工作,输出如下:

invalid literal for int() with base 10: 's'
NameError: name 'e' is not defined
然而,在Python 3中,我惊讶地发现输出是:

invalid literal for int() with base 10: 's'
NameError: name 'e' is not defined

这是为什么?

我后来找到了一个答案,解释说在Python 3中,捕获的名称在
套件的末尾被删除,除了
之外,以实现更高效的垃圾收集。如果希望避免出现这种情况,还建议使用以下语法:

需要保留异常实例的情况 除了组曲的结尾外,可以很容易地这样翻译

try:
    ...
except E as N:
    ...
...
变成

try:
    ...
except E as N:
    n = N
    ...
…
这样,当在块末尾删除N时,N将保持不变 可以正常使用