java全局异常处理器的核心是解耦业务逻辑与错误响应,通过统一响应结构、枚举化错误码、自定义业务异常、@restcontrolleradvice集中拦截及jvm级兜底机制实现分层清晰、扩展方便、细节隐藏。

Java中优雅设计全局异常处理器,核心是把业务逻辑和错误响应解耦,让Controller只专注处理请求、返回数据,异常由统一入口拦截并格式化输出。关键不在“写多少代码”,而在“分层清晰、扩展方便、不暴露细节”。
定义统一响应结构与错误码体系
所有接口无论成功或失败,都应返回一致的JSON格式。推荐包含状态码(code)、提示信息(message)、时间戳(timestamp)和可选数据(data)字段。错误码不要用魔数,而是通过接口+枚举实现模块化管理:
- 定义ErrorCode接口,声明getCode()和getMessage()
- 按业务域建枚举类,如UserErrorCode.USER_NOT_FOUND(1001, "用户不存在")
- 封装通用响应类Result
,提供success()和fail(ErrorCode)等静态工厂方法
自定义业务异常并规范抛出位置
区分系统异常(如NullPointerException)和业务异常(如“库存不足”),前者通常代表程序缺陷,后者是正常业务流转的一部分。建议创建一个顶层业务异常类:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 继承RuntimeException,避免强制try-catch干扰业务流
- 构造时传入ErrorCode实例,自动携带code和message
- 只在Service或Controller中显式throw,不吞异常、不裸抛Exception
用@RestControllerAdvice集中拦截与响应
@RestControllerAdvice是Spring Boot中处理Controller层异常的标准方式,它自动适配REST接口,无需额外@ResponseBody。重点在于匹配顺序和职责划分:
- 优先处理自定义业务异常,返回对应HTTP状态码(如400/404/500)和业务错误码
- 再处理Spring内置校验异常(如MethodArgumentNotValidException),提取字段级错误信息
- 最后兜底处理Throwable,记录日志但不暴露堆栈,统一返回500 + 友好提示
- 每个@ExceptionHandler方法只负责一类异常,避免if-else判断类型
补充非Web场景的异常兜底机制
@RestControllerAdvice只对@Controller/@RestController生效,对定时任务、线程池、Filter或异步调用无效。这时需引入JVM级兜底:
- 在应用启动早期(如main方法或@PostConstruct中)设置Thread.setDefaultUncaughtExceptionHandler
- 主要用于记录日志、发送告警、保存现场,不能构造HTTP响应
- 注意:它捕获的是未被任何catch捕获的异常,已显式吞掉的异常不会触发
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










