优雅异常处理需构建“分层拦截+主动兜底+协同治理”闭环:业务异常语义化定义、http层@controlleradvice统一响应、网关与熔断器联动降级,前端配合体验闭环。

全局异常处理中实现优雅的异常降级与熔断响应,关键不是堆砌 try-catch,而是构建“分层拦截 + 主动兜底 + 协同治理”的闭环机制。它需要业务异常语义化、HTTP 层统一收口、网关与熔断器联动,三者缺一不可。
定义清晰的业务异常体系
所有非系统级错误(如参数错、资源不存在、权限不足)都应抛出预定义的自定义异常,而非 RuntimeException 或裸 throw new Exception()。这样后续才能被精准捕获和分类处理。
- 每个异常类绑定唯一 error code、HTTP 状态码、用户提示语,例如 ValidationError(code=422, status=400) 表示参数校验失败,前端可据此做表单高亮
- 避免在 controller 中直接 return ResponseEntity.badRequest(),而是 throw new ValidationError("用户名不能为空")
- 异常类本身不包含日志逻辑,日志由全局处理器统一记录,确保上下文(traceId、requestId、URI、method)完整
用 @ControllerAdvice 统一收口 HTTP 响应
Spring Boot 中,通过 @RestControllerAdvice 配合 @ExceptionHandler 实现异常到标准 JSON 响应的映射。重点在于:按异常类型分层处理,而非只捕获 Exception.class。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 优先处理业务异常(如 UserException、OrderException),返回 200 + {code: 4001, message: "库存不足"},便于前端统一解析
- 其次处理框架异常(如 MethodArgumentNotValidException),提取校验失败字段,组装结构化错误信息
- 最后兜底处理 Throwable,此时应设为 500,且绝不暴露堆栈、数据库路径、服务器版本等敏感信息,仅返回通用提示如“服务暂时不可用”
- 配合 @Order(-1) 确保该处理器优先级最高,防止被其他 advice 覆盖
与网关、熔断器协同做服务级降级
Java 层的异常处理只是第一道防线。真正的优雅降级必须下沉到微服务基础设施层。
- API 网关(如 Spring Cloud Gateway)对下游返回的 4xx/5xx 响应自动补全 traceId、标准化 X-Error-Code header,并转发给前端;同时可配置 fallback 路由,比如用户中心超时则返回缓存头像
- 熔断器(如 Resilience4j)在调用远程服务前检查熔断状态,一旦开启,直接执行 fallback 方法(如查本地 Redis 缓存、返回默认值),不抛异常、不走 Controller 异常链
- 调用方收到响应后,需解析 body 中的 code 字段做业务分支,而非只依赖 HTTP 状态码——因为降级响应往往用 200 包装业务错误
前端配合完成体验闭环
后端降级再完善,若前端无感知或无响应,用户仍会看到白屏或卡顿。
- 全局请求拦截器识别标准 error code,自动 toast 提示或跳转错误页,避免弹窗重复触发
- 关键操作(如支付、提交订单)增加 loading 锁和超时控制,超时后主动触发本地降级逻辑(如保存草稿、提示“网络不稳定,请稍后重试”)
- 错误页需区分场景:404 显示友好引导,500 显示刷新按钮+上报 ID,业务错误(code=4001)显示具体原因并提供操作建议










