Python双参数求和函数try-except编写报SyntaxError问题排查
问题背景
我编写了一个接收两个输入值、返回求和结果的add函数,需求是:当任意一个入参的类型不是int或float时,抛出异常。
初始编写的代码如下:
def add(a, b): try: return a+b except: raise TypeError("{0} is invalid".format(a)) except: raise TypeError("{0} is invalid".format(b))
运行代码后得到报错:
SyntaxError: default 'except:' must be last
报错原因
这个报错和return语句的位置无关,核心问题有两点:
- Python语法规定,同一个
try代码块中,不指定具体异常类型的裸except:(也就是捕获所有异常的默认分支)最多只能存在1个,且必须放在所有except分支的最后。你连续写了两个裸except:,直接违反语法规则,解释器在解析代码阶段就会抛出该语法错误,不会执行函数内的任何逻辑。 - 就算修正语法问题,这套异常处理逻辑也无法满足需求:
a+b执行抛出异常时,只会进入第一个匹配的except分支,永远不会走到第二个except,根本无法区分是哪个参数非法。此外靠a+b是否报错判断参数类型本身就不可靠——比如传入两个字符串时,+会执行字符串拼接操作,不会抛出任何错误,但字符串显然不符合入参类型要求。
正确实现方案
不要等加法运算报错再做异常兜底,应该在执行运算前主动校验两个入参的类型,不符合要求直接抛出对应异常即可:
def add(a, b): # 逐个校验入参类型 if not isinstance(a, (int, float)): raise TypeError(f"{a} is invalid") if not isinstance(b, (int, float)): raise TypeError(f"{b} is invalid") # 校验通过后执行求和返回 return a + b
如果确实需要使用try-except结构,也不要写多个裸except,且不要用裸except无差别捕获所有异常,应当指定要捕获的具体异常类型,同时前置类型校验逻辑。
内容的提问来源于stack exchange,提问作者Zizzipupp
相关产品推荐
相关产品推荐

