Python中try...except Exception as绑定同名变量引发NameError问题咨询
问题底层原因解释
这是Python 3针对异常变量设计的自动清理机制导致的,属于语言层面的既定规则:
- 使用
except 异常类型 as 变量名语法捕获异常时,该异常变量的作用域仅被限制在当前except代码块内部 - 无论外部作用域是否存在同名变量,只要except块执行完成,Python会自动从当前作用域中删除这个绑定过异常的变量
- 该设计的目的是避免异常实例持有调用栈帧引用,导致不必要的内存泄漏,该规则仅在Python 3中生效,Python 2中不存在,同一段代码在Python 2环境下运行不会触发NameError。
对应第一段代码的执行逻辑:
- 每次循环开头声明了
error = None,此时error变量在循环作用域内有效 - 当i=0触发除零异常时,进入
except Exception as error分支,error被重新绑定为异常实例 - 执行完
print(error)后except块结束,Python自动删除error变量 - 后续执行
if error is None判断时,error已经被清理,因此触发NameError。
修改后的代码将异常绑定变量和状态标记变量分开,异常绑定的err会被清理,但标记状态的error不受影响,因此可以正常运行。如果需要在except块外获取异常信息,可在except块内部将异常内容赋值给外部变量留存:
x = 1 for i in range(5, -1, -1): error = None err_info = None try: x = x / i except Exception as e: err_info = str(e) error = True if error is None: print(f"x={x}: No problem") else: print(f"执行出错:{err_info}")
内容的提问来源于stack exchange,提问作者Bill
相关产品推荐
相关产品推荐

