代码之家  ›  专栏  ›  技术社区  ›  knipknap

“except Foo as bar”导致“bar”从范围中删除[重复]

  •  41
  • knipknap  · 技术社区  · 8 年前

    给定以下代码:

    msg = "test"
    try:
        "a"[1]
    except IndexError as msg:
        print("Error happened")
    print(msg)
    

    有人能解释为什么这会导致Python3中的以下输出吗?

    Error happened
    Traceback (most recent call last):
      File "test.py", line 6, in <module>
        print(msg)
    NameError: name 'msg' is not defined
    
    3 回复  |  直到 8 年前
        1
  •  51
  •   user2357112    8 年前

    msg 在except子句中,与 味精

    但是 in Python 3 we have this new behavior too :

    当使用 as target ,在 except子句的结尾。这就好像

    except E as N:
        foo
    

    已翻译为

    except E as N:
        try:
            foo
        finally:
            del N
    

    这意味着必须将该异常分配给要创建的其他名称 循环堆栈帧,使该帧中的所有局部变量保持活动状态 直到下一次垃圾回收发生。

    所以,你“覆盖”

        2
  •  34
  •   blhsing    8 年前

    是的,只要提出例外情况 msg except 阻止。

    __del__ 对象的方法和指定给的异常 味精 :

    class A:
        def __del__(self):
            print('object deleted')
    class E(Exception):
        def __del__(self):
            print('exception deleted')
    msg = A()
    try:
        raise E()
    except E as msg:
        print("Error happened")
    

    这将输出:

    object deleted
    Error happened
    exception deleted
    NameError: name 'msg' is not defined
    
        3
  •  7
  •   Michael    8 年前

    1) msg 设置为本地范围中的某个字符串

    2) 味精

    3) 在异常块结束时从本地范围中删除

    味精 不再在本地范围中定义,因此访问它的尝试失败