首页/开发/代码质量与评审速查/评审检查项:错误处理
代码评审64 条

评审检查项:错误处理

错误处理检查:失败路径是否被显式处理、错误是否被吞(空 catch)、错误信息能否支撑排查、资源在异常路径上是否仍释放。

错误处理检查看什么

错误处理检查的重点是失败路径:错误是否被显式处理而不是被吞掉、错误信息能否支撑排查、资源在异常路径上是否仍然释放、重试与降级是否安全。这些代码平时不执行,出问题时才暴露,因此在评审中最容易被跳过。

基本信息

高频问题空 catch、忽略返回值、默认值掩盖失败
上下文要求错误信息包含操作、对象标识与原始原因
资源约束文件、连接、锁在异常路径同样要释放
重试要求可恢复且幂等,并设置上限与退避

逐项看什么

  • 空 catch 或忽略返回值:错误被静默吞掉,这是最常见的一类问题。
  • 错误信息是否带上下文(操作、参数、对象 ID),能否用于定位。
  • 资源释放:文件句柄、数据库连接、锁在异常路径上是否仍会释放。
  • 重试与降级:是否幂等、有没有上限与退避、失败会不会被放大。
  • 异常类型边界:可恢复错误与致命错误是否被混在一起处理。

吞错的典型形态

形态后果
空 catch 块故障被掩盖,排障只能靠猜
catch 后只打日志继续跑调用方以为成功,数据停在中间状态
忽略返回码或错误值失败被当成成功,后续逻辑带着脏状态执行
默认值兜底掩盖配置或网络问题,表现为难以解释的行为
捕获所有异常一把抓分不出可恢复错误,重试策略失效

错误信息的写法

错误信息的写法
# 差:只有一句失败
log.error("查询失败");

# 好:操作 + 对象标识 + 原始原因
log.error("查询订单失败 orderId={} userId={}", orderId, userId, e);

# 边界:日志里不要带完整凭据或个人信息
# 重试:只对幂等且可恢复的失败重试,设置上限与退避

重试与降级怎么看

  • 只对幂等操作重试:重复提交带来的副作用往往比失败本身更麻烦。
  • 重试要有上限与退避:无限重试会把下游压力放大成雪崩。
  • 降级路径要明确:返回缓存、返回默认值还是直接失败,取决于业务能否接受。
  • 降级要可观测:静默降级等于把问题藏起来,需要指标或日志留痕。
见到 catch 后只打日志继续跑,要追问:这里继续执行是否安全?
看错误处理时先看调用方:同一个失败在不同调用方可能需要不同处置,异常设计要能支撑这种区分。

易错点

  • catch 抹平一切异常:故障被掩盖,排障只能靠猜。
  • 错误信息只写「失败」两个字:线上无法定位根因。
  • 异常路径不释放资源:连接泄漏,故障后系统迟迟无法恢复。
  • 对非幂等操作加自动重试:重复扣款、重复发消息一类问题由此产生。
  • 降级但不告警:数据悄悄变差,等业务发现时已积累大量脏数据。

数据来源与参考

  • Google Engineering Practices · What to look for in a code review(Functionality)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌