为何使用未定义错误名ButtError未触发NameError或SyntaxError?
为什么使用不存在的异常名ButtError却没触发错误?
这是因为Python对except子句中异常类型的求值逻辑是按需触发的:只有当try块抛出了异常,并且Python需要检查当前except子句是否匹配该异常时,才会去解析这个异常名。
回到你的代码具体流程:
- 调用
mid_level(-1)时,fun(-1)触发AssertionError。 - 这个异常进入
mid_level的try-except结构,首先检查except ButtError:分支——但AssertionError和不存在的ButtError完全不匹配,所以Python不会去解析ButtError这个名字,直接跳过该分支,把异常向上抛出。 - 外层
try-except中,AssertionError属于Exception的子类,被except Exception:分支捕获,x被设为9,程序正常执行到结束。
全程ButtError这个名字都没被Python实际求值过,自然不会触发NameError或SyntaxError。
如果想验证这个逻辑,可以修改代码让Python必须解析ButtError:比如在mid_level的try块里抛出一个任意异常,并且把ButtError放到第一个except子句,同时删掉后续能匹配该异常的分支。比如:
def mid_level(x): try: raise Exception() except ButtError: print(333) raise # 删掉其他except分支
这时候运行代码,Python在检查except ButtError:时会尝试解析这个名字,就会立刻触发NameError: name 'ButtError' is not defined。
内容的提问来源于stack exchange,提问作者Aven Desta
相关产品推荐
相关产品推荐

