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

发布于 2021-01-29 16:53:38

由于在Python中,变量可以在其循环和try-except块之外访问,因此我天真地认为以下代码段可以正常工作,因为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

为什么是这样?

关注者
0
被浏览
47
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我后来发现一个答案,因为PEP 3110解释了在Python
    3中,捕获的名称在except套件末尾被删除,以实现更有效的垃圾收集。如果您希望避免这种情况,还建议使用语法:

    可以很容易地翻译出需要在except套件末尾附近保留异常实例的情况,就像这样

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

    变成

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

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看