为何三元运算符中raise语句触发TypeError:异常必须继承BaseException?
三元运算符里用raise为啥报错?
先看两段代码:
第一段完全正常:
if False: raise Exception else: print('else')
运行后会输出else,没任何问题。
但换成三元运算符写法就触发错误TypeError: exceptions must derive from BaseException:
raise Exception if False else print('else')
明明逻辑看起来一致,为啥结果差这么多?
问题根源
Python的三元运算符A if 条件 else B本质是个表达式,必须返回一个值。但raise是语句,不是表达式——它不会返回任何内容,而print('else')的返回值是None。
当你写raise Exception if False else print('else')时,Python会先计算三元表达式的结果:因为条件为False,所以取else分支的print('else')返回值None,然后把这个None作为raise的参数,相当于执行了raise None。None不是BaseException的子类,自然就触发了类型错误。
而第一段的if-else是语句结构,else分支直接执行print,根本不会把print的返回值传给raise,所以完全正常。
正确写法
要是想写简洁代码,别硬把raise塞进三元运算符里(毕竟raise是语句,不能当表达式用),可以写成单行if-else:
if False: raise Exception else: print('else')
非要用类似三元的结构?那就把raise包装成函数(函数调用属于表达式):
def raise_exception(): raise Exception raise_exception() if False else print('else')
这样条件不满足时,只会执行print('else'),不会触发异常,和第一段代码结果一致。
内容的提问来源于stack exchange,提问作者장명래
相关产品推荐
相关产品推荐

