springmvc全局异常捕获推荐使用@restcontrolleradvice配合@exceptionhandler,自动拦截controller层异常并返回标准化json响应;需确保类被spring扫描到,按异常类型分级处理,返回统一result结构且不泄露敏感信息。

在 SpringMVC 中实现全局异常捕获,核心是把散落在各层的异常统一拦截、转换为前端可读的标准化响应,而不是让原始堆栈或 500 页面直接暴露出去。最主流、推荐且零第三方依赖的方式,就是使用 @RestControllerAdvice 配合 @ExceptionHandler。
用 @RestControllerAdvice 定义全局处理类
这个注解相当于给整个 Controller 层加了一层“异常守门员”:
- 它自动生效于所有
@RestController和@Controller类抛出的异常; - 自带
@ResponseBody效果,方法返回值会直接序列化成 JSON,适配前后端分离场景; - 必须保证该类被 Spring 容器扫描到(比如放在主启动类同包或子包下,或显式加
@Component)。
用 @ExceptionHandler 分类处理具体异常
在一个处理类里,可以写多个带 @ExceptionHandler 的方法,按异常类型精准响应:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
@ExceptionHandler(BizException.class):处理自定义业务异常,返回友好提示和业务码; -
@ExceptionHandler(MethodArgumentNotValidException.class):捕获参数校验失败(如@Valid),提取字段错误信息; -
@ExceptionHandler(Exception.class):兜底处理所有未明确声明的运行时异常,通常记录日志并返回通用错误码; - 注意:异常类型越具体的方法优先级越高,兜底方法应放在最后。
返回统一结构,避免信息泄露
不要直接返回 e.getMessage() 或打印堆栈给前端:
- 响应体建议封装为标准格式,例如
Result<t></t>,含code、msg、data字段; - 对系统级异常(如
NullPointerException),msg应固定为“系统繁忙,请稍后重试”,不暴露技术细节; - 敏感信息(如数据库表名、路径、配置项)绝不能出现在返回内容中。
补充说明:其他方式存在但不推荐为主流
还有两种老式方案,目前基本只用于特定兼容场景:
-
SimpleMappingExceptionResolver:基于 XML 配置,跳转 JSP 错误页,不适合纯 REST API; - 实现
HandlerExceptionResolver接口:灵活性高但代码量大,维护成本高,新项目无需手动造轮子。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










