You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 23:51:14