Python Codio练习题:SyntaxError未按预期抛出问题排查
存在的问题
- 异常处理逻辑错误:捕获AssertionError后仅打印提示文本,没有按要求抛出
SyntaxError或ValueError类型的异常,导致测试无法检测到预期异常。 - 格式校验逻辑不合理:用去空格后全为数字的规则校验整个输入,若学号允许包含非数字字符会产生误判;同时没有校验输入拆分后的字段数量是否符合要求。
- 校验方式不严谨:使用assert做业务校验,Python开启优化模式时assert会被忽略,导致校验逻辑失效。
- 拼写错误:penalty拼写为
penanlty,虽不影响运行但不符合规范。
修改后的代码
def calculate_mark(s): parts = s.split() # 校验输入拆分后必须是3个字段 if len(parts) != 3: raise SyntaxError student_number = parts[0] # 校验分数、扣分项为合法整数 try: student_mark = int(parts[1]) student_penalty = int(parts[2]) except ValueError: raise SyntaxError # 校验扣分值不大于原始分数 if student_penalty >= student_mark: raise ValueError # 计算返回结果 final_mark = student_mark - student_penalty return f"{student_number} {final_mark}"
修改说明
- 所有格式不符合要求的场景(字段数不对、分数/扣分项不是整数)都会直接抛出
SyntaxError,满足测试要求,测试用例calculate_mark("john xx 30")会因为第二个字段无法转为整数触发SyntaxError。 - 扣分值大于等于原始分数时直接抛出
ValueError,符合需求。 - 移除了assert和异常捕获逻辑,所有异常都会正常向上抛出,测试可以正常捕获校验结果。
内容的提问来源于stack exchange,提问作者Emilia Delizia
相关产品推荐
相关产品推荐

