您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在`except`子句中的名称绑定在子句之后删除

在`except`子句中的名称绑定在子句之后删除

不,这不是错误。在Python 3文档中,针对try/except语句明确定义了您所遇到的行为。还给出了此行为的原因:

当使用分配了异常后as target,该异常将在该except子句的末尾清除。好像

except E as N:
   foo

被翻译成

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

这意味着必须将异常分配给其他名称,以便在except子句之后引用它。 。

try/except块范围之外声明名称无效的原因是因为您excas子句中使用了该名称。这就是Python删除名称

解决方法是在as子句中使用其他名称将异常绑定到,然后将全局变量分配给其他异常名称

>>> exc_global = None
>>> try:
    1 / 0
    text_template = "All fine!"
except ZeroDivisionError as exc:
    exc_global = exc
    text_template = "Got exception: {exc.__class__.__name__}"


>>> print(text_template.format(exc=exc_global))
Got exception: ZeroDivisionError

正如Anthony Sottile在评论中指出的,try/except代码的反汇编也明确支持文档中的上述声明:

>>> code = """
try:
    1/0
    text_template = "All fine!"
except ZeroDivisionError as exc:
    text_template = "Got exception: {exc.__class__.__name__}"
"""
>>> from dis import dis
>>> dis(code)
  2           0 SETUP_EXCEPT            16 (to 18)

  3           2 LOAD_CONST               0 (1)
              4 LOAD_CONST               1 (0)
              6 BINARY_TRUE_DIVIDE
              8 POP_TOP

  4          10 LOAD_CONST               2 ('All fine!')
             12 STORE_NAME               0 (text_template)
             14 POP_BLOCK
             16 JUMP_FORWARD            38 (to 56)

  5     >>   18 DUP_TOP
             20 LOAD_NAME                1 (ZeroDivisionError)
             22 COMPARE_OP              10 (exception match)
             24 POP_JUMP_IF_FALSE       54
             26 POP_TOP
             28 STORE_NAME               2 (exc)
             30 POP_TOP
             32 SETUP_FINALLY           10 (to 44)

  6          34 LOAD_CONST               3 ('Got exception: {exc.__class__.__name__}')
             36 STORE_NAME               0 (text_template)
             38 POP_BLOCK
             40 POP_EXCEPT
             42 LOAD_CONST               4 (None)
        >>   44 LOAD_CONST               4 (None)
             46 STORE_NAME               2 (exc)
             48 DELETE_NAME              2 (exc)
             50 END_FINALLY
             52 JUMP_FORWARD             2 (to 56)
        >>   54 END_FINALLY
        >>   56 LOAD_CONST               4 (None)
             58 RETURN_VALUE
其他 2022/1/1 18:37:52 有471人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶