【问题标题】:Scope of caught exception instance in Python 2 and 3Python 2 和 3 中捕获的异常实例的范围
【发布时间】:2017-10-30 17:33:33
【问题描述】:

由于 Python 中的变量可以在其循环和 try-except 块之外访问,我天真地认为下面的这段代码 sn-p 可以正常工作,因为 e 可以访问:

try:
    int('s')
except ValueError as e:
    pass
print(e)

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

invalid literal for int() with base 10: 's'

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

NameError: name 'e' is not defined

这是为什么?

【问题讨论】:

    标签: python python-2.7 python-3.x exception scope


    【解决方案1】:

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

    需要保留异常实例的情况 除了套件的末尾可以像这样轻松翻译

    try:
        ...
    except E as N:
        ...
    ...
    

    变成

    try:
        ...
    except E as N:
        n = N
        ...
    …
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-01
      • 2015-04-26
      • 2020-12-06
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多