审查错误处理
找出被吞掉的异常和无法诊断的报错
审查下面这段代码的错误处理。只关注失败路径:1)哪些异常被吞掉或降级成了默认值,出问题时会不会静默出错;2)错误信息是否足以定位(有没有带上关键 id、入参、上游状态);3)哪些重试是不安全的(非幂等、会重复扣款或重复写入);4)哪些地方该失败却继续跑,哪些该继续却整个中断;5)给出修改后的关键片段。 ``` [粘贴代码] ```
使用建议
重点看它标出的静默失败:这类 bug 上线后最难发现,也最难回溯。
适合什么场景
- 线上出现「没报错但数据不对」,日志里什么都没有。
- 要接支付、退款或消息队列,失败路径的代价远高于正常路径。
不适合的场景
- 代码是一次性脚本或 CLI 工具:吞掉异常继续跑是合理选择,不必按服务标准审。
- 问题在重试策略的整体设计(队列、死信、退避),不在单个 try/catch:先看架构。
示例
输入
def charge(order_id, amount):
try:
resp = payment.charge(order_id, amount)
db.update(order_id, status="paid")
return True
except Exception:
return False你会得到
指出 `except Exception` 吞掉全部异常且不打日志,失败原因不可诊断;payment 成功但 db.update 失败会重复扣款,因为既没有幂等键也没有事务边界;返回 bool 让调用方无法区分「余额不足」和「网络超时」。改法:记录 order_id、amount 和上游错误码,用幂等键,并先写本地状态再确认。
常见误用
- 只让它「加点日志」,不区分「该失败」和「该重试」:日志补上了,语义仍然是错的。
- 贴的代码里原始异常已经被 `str(e)` 压成字符串,它看不到错误类型,只能给通用建议。
可以这样改
- 加「按『用户会损失钱 / 会看到错误 / 只是少一条统计』三档排优先级」,输出能直接排期。
- 要求「给每处失败对应的用户可见文案」,能逼出「静默失败」的具体场景。