seo 标题:注意,python 的错误捕捉会覆盖同名的变量,导致 UnboundLocalError: local variable 'error' referenced before assignment

发现一个问题,如果我在一个函数里面,想把是什么错误也给返回的话,也会遇到 UnboundLocalError: local variable 'error' referenced before assignment 报错

def parse():
    assert False


def main():
    error = None
    try:
        parse()
    except Exception as error:
        pass
    return error


if __name__ == "__main__":
    main()

运行报错

Traceback (most recent call last):
  File "/home/pon/code/me/ideaboom/dddd/1.py", line 16, in <module>
    main()
  File "/home/pon/code/me/ideaboom/dddd/1.py", line 12, in main
    return error
UnboundLocalError: local variable 'error' referenced before assignment

因为 except Exception as error 中的 error 会覆盖一开始的 error = None,但是 except Exception as error 中的 error 的作用域只有在 try except 中,导致 try except 执行完毕之后,error 就被释放不可访问到了,从而导致 return error 的时候,报错 UnboundLocalError 了

非常的无语,感觉是 cpython 的逻辑漏洞

测试了 cpython3.8-cpython3.13 都存在这个问题,看来只能接受避免了,就当做 cpython 的特性算了


universe_king
3.5k 声望716 粉丝