企业级spring boot项目需构建分层异常体系与全局拦截:按职责定义基类、枚举码值、具体异常类;用@restcontrolleradvice精准处理业务异常与兜底;日志需带traceid、脱敏参数并对接监控;上线前须验证文档一致性、前端映射及压测覆盖。

在企业级 Spring Boot 项目中,规范的异常类体系和全局拦截不是“锦上添花”,而是保障系统可维护性、可观测性和协作效率的基础设施。核心在于:分层定义异常类型、统一响应结构、精准拦截范围、日志上下文完备、生产环境安全兜底。
一、异常类体系设计:按职责分层,用枚举驱动
避免泛用 RuntimeException 或 Exception,所有业务异常必须显式声明、分类清晰、码值可查。
- 基础异常基类:定义公共字段(code、message、timestamp),不直接抛出,仅被继承;推荐使用 Lombok + @Getter/@AllArgsConstructor 简化
- 业务异常枚举:如 ResultCode,明确区分 4xx(客户端错误)、5xx(系统故障)、6xx(业务规则失败);每个枚举项含 code 和国际化 key(如 "user.not.found"),便于后续多语言支持
- 具体业务异常类:如 UserNotFoundException、InsufficientStockException,均继承自统一基类,构造时传入对应枚举项,自动携带码值与默认提示
- 禁止裸 throw new RuntimeException("xxx"):这类写法无法被全局处理器精准识别,也丢失结构化信息
二、全局异常拦截:用 @RestControllerAdvice 精准覆盖
@RestControllerAdvice 是企业级项目的标准选择,它天然适配 JSON 响应,无需额外加 @ResponseBody。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 优先处理已知业务异常:为每个自定义异常类单独写 @ExceptionHandler 方法,返回对应 HTTP 状态码(如 404 对应资源不存在,403 对应权限拒绝)
- 兜底处理通用异常:用 @ExceptionHandler(Exception.class) 捕获未显式声明的异常,但生产环境必须屏蔽堆栈、返回泛化提示(如“系统繁忙,请稍后再试”)
- 不要忽略 Spring MVC 自带异常:如 MethodArgumentNotValidException(参数校验失败)、HttpRequestMethodNotSupportedException(HTTP 方法不支持),建议重写 ResponseEntityExceptionHandler 的对应方法,统一转为标准 Result 格式
- 绑定请求上下文:在 handler 方法参数中注入 HttpServletRequest,记录 requestURI、method、client IP,用于日志追踪和告警分析
三、日志与监控协同:异常即指标,日志带链路
异常处理不能只停留在“返回友好提示”,更要支撑快速定位和趋势分析。
- ERROR 级必打完整堆栈 + 上下文:包括 traceId(通过 MDC 注入)、请求参数(脱敏后)、用户 ID(如有)、耗时;避免只打 message
- 区分日志级别:参数校验失败用 WARN,数据库连接超时用 ERROR,空指针等系统异常打 ERROR 并触发告警
- 对接监控平台:用 Micrometer 统计各异常类型出现频次,配置 Prometheus 告警规则(如 BusinessException 每分钟超 10 次即通知)
- 敏感信息零落地:日志中过滤密码、token、银行卡号等字段;响应体中绝不返回 stackTrace、SQL 片段、内部路径
四、上线前必须验证的三项检查
再完善的方案,不验证就等于没做。
- 接口文档一致性:用 Swagger 或 OpenAPI 生成的文档中,“错误响应”部分是否准确列出所有可能的 code/msg 组合
- 前端错误码映射表:确认前端已建立 code → 提示文案 / 跳转逻辑 的映射关系,避免“601”在页面显示为“未知错误”
- 压测场景覆盖:模拟高并发下 DB 连接池耗尽、Redis 超时、下游服务不可用等真实故障,观察全局处理器是否稳定拦截、日志是否可查、告警是否触发










