Skip to content
Spring Web 请求链路 · 第 2 篇 / 共 4 篇
领域编程与框架
专题Spring 专题
当前序列Spring Web 请求链路
阅读位置第 2 篇 / 共 4 篇当前专题第 1 个序列 / 共 6 个序列

Spring 全局异常处理怎么设计:别只会 try-catch,要把错误边界收口

很多项目一开始写异常处理时,最常见的方式就是:

  • Controller 里自己 try-catch
  • 出错了直接返回字符串
  • 或者统一 catch Exception

这种写法短期能跑,但项目一大就会很乱。

先说结论

更稳妥的 Spring 异常处理,通常要把这几件事分开:

  1. 业务异常和系统异常分层
  2. 返回给前端的内容和记录到日志的内容分开
  3. Controller 不负责到处 try-catch
  4. 用统一异常处理把错误边界收口

一、为什么不要在 Controller 到处写 try-catch

因为这样会带来三个问题:

  • 接口返回格式不统一
  • 日志记录不一致
  • 新同事很难知道哪里该怎么处理

真正成熟一点的后端项目,Controller 更适合只关心:

  • 参数接收
  • 调用 Service
  • 返回结果

异常边界应该统一放到全局去处理。

二、业务异常和系统异常一定要分开

这一步非常关键。

业务异常通常表示:

  • 参数不符合业务规则
  • 状态不满足操作条件
  • 库存不足
  • 重复提交

系统异常通常表示:

  • 空指针
  • 数据库连接失败
  • 下游服务超时
  • 程序 Bug

这两类异常对前端和日志来说,处理方式完全不一样。

三、统一异常处理到底在做什么

本质上是在回答两个问题:

  1. 这个错误应该返回什么给调用方
  2. 这个错误应该如何记录、告警和排查

所以全局异常处理器不是“把异常吞掉”,而是:

  • 把不一致的错误出口收敛起来

四、一个更实用的设计思路

1. 定义统一返回结构

比如统一返回:

  • 是否成功
  • 业务码
  • 提示信息
  • 数据体

这样前端和调用方更容易稳定处理。

2. 业务异常自定义

业务异常一般要明确:

  • 错误码
  • 可读消息
  • 是否需要展示给用户

3. 参数校验异常单独处理

这类异常很高频,最好单独收口,否则前端看到的体验会很差。

4. 兜底系统异常统一处理

对未知异常统一兜底,避免把堆栈直接暴露给前端。

五、日志该怎么记

这里特别容易踩坑。

更稳妥的方式通常是:

  • 业务异常可以少打或按需打
  • 系统异常要带请求上下文和关键参数
  • 不要同一异常重复打印多次

很多项目日志爆炸,不是异常多,而是:

  • Controller 打一次
  • 全局处理器再打一次
  • 网关或调用链再打一次

六、最容易踩的坑

1. catch Exception 后直接返回成功结构

这会把问题藏得很深。

2. 所有错误都返回同一个提示

调用方根本分不清:

  • 是参数错了
  • 还是服务真的出故障了

3. 把数据库错误原样返回给前端

这既不安全,也不友好。

一句话总结

Spring 全局异常处理真正要做的,不是“把所有异常抓住”,而是把:

  • 错误分层
  • 返回统一
  • 日志收口
  • 排查留痕

这四件事同时做好。

延伸阅读相关文章优先当前专题,再补跨专题关联。
同一序列 · 顺着当前主线继续读Spring 参数校验与统一返回怎么配合适合按过滤器、拦截器、参数校验、异常处理和鉴权链路往下读。Spring 专题 · Spring Web 请求链路同一序列 · 顺着当前主线继续读Spring 登录鉴权怎么设计适合按过滤器、拦截器、参数校验、异常处理和鉴权链路往下读。Spring 专题 · Spring Web 请求链路同专题其他序列 · Spring Boot 启动、装配与配置@Conditional 系列注解怎么配合使用适合把自动装配、条件装配、Profile 和循环依赖放回 Spring Boot 启动过程里理解。Spring 专题 · Spring Boot 启动、装配与配置同专题其他序列 · Spring Web 链路与治理能力@Transactional 和 @Async 一起用为什么容易踩坑适合把分发链路、鉴权机制、异步事务和接口治理放在同一条 Web 主线上整理。Spring 专题 · Spring Web 链路与治理能力跨专题关联 · 同场景:基础学习保留策略和日志压缩适合哪些场景适合把副本机制、acks、批量压缩和日志组织放在一条 Kafka 投递主线上理解。Kafka 专题 · Kafka 投递链路与日志存储机制跨专题关联 · 同场景:基础学习迟到数据、侧输出流和补数边界适合把 Savepoint、迟到数据和两阶段提交放在一起看。Flink 专题 · Flink 状态一致性与迟到数据处理
继续阅读Spring Web 请求链路当前序列第 2 篇 / 共 4 篇当前专题第 1 个序列 / 共 6 个序列
往前看
上一篇过滤器和拦截器的区别回到当前序列上一章上一序列JVM 与进程排障从第 1 篇开始:JVM 内存问题怎么分析
往后看
下一篇Spring 参数校验与统一返回怎么配合继续当前序列下一章下一序列Spring Boot 与事务实践从第 1 篇开始:Spring Boot 开发笔记

把零散经验整理成可查、可复用、可持续更新的企业级知识门户