@exceptionhandler 是 spring mvc 中用于局部异常处理的注解,仅作用于当前 controller,支持按异常类型精准匹配并返回视图、json 或 responseentity;全局使用需配合@controlleradvice。

@ExceptionHandler 是 Spring MVC 中用于**局部异常处理**的核心注解,它让开发者能在 Controller 层精准捕获并响应特定类型的异常,避免异常向上抛出导致 500 错误页面或 JSON 崩溃。
作用范围:只对当前 Controller 有效
它必须定义在 @Controller 或 @RestController 类内部(不能单独写在工具类里),方法参数可接收对应异常、HttpServletRequest、HttpServletResponse、Model 等,返回值支持 String(视图名)、ResponseEntity、Object(自动转 JSON)等。
- 同一个 Controller 中,多个 @ExceptionHandler 可分别处理不同异常,Spring 按类型匹配最具体的那个
- 若想全局生效,需配合 @ControllerAdvice 使用(推荐用于统一异常处理)
基本用法:捕获指定异常并返回友好响应
例如,当用户传入非法 ID 时抛出 IllegalArgumentException,可这样拦截:
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
if (id handleIllegalArgument(IllegalArgumentException e) {
return ResponseEntity.badRequest().body("参数错误:" + e.getMessage());
}
此时访问 /user/-1 就会返回 HTTP 400 和自定义提示,而不是堆栈信息。
配合 @ControllerAdvice 实现全局异常处理
把 @ExceptionHandler 提升为全局,只需把它移到一个被 @ControllerAdvice 注解的类中:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(NullPointerException.class)
public ResponseEntity<string> handleNPE(NullPointerException e) {
return ResponseEntity.status(500).body("系统忙,请稍后再试");
}
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<map object>> handleUserNotFound(UserNotFoundException e) {
Map<string object> result = new HashMap();
result.put("code", 404);
result.put("message", e.getMessage());
return ResponseEntity.status(404).body(result);
}
}</string></map></string>
这样所有 Controller 抛出的 UserNotFoundException 都会被统一拦截并格式化输出。
注意细节:优先级与继承关系
Spring 按异常类型匹配时遵循最具体优先原则:
- 如果同时存在
@ExceptionHandler(Exception.class)和@ExceptionHandler(RuntimeException.class),而实际抛出的是NullPointerException(是 RuntimeException 子类),则后者生效 - 若方法参数含
Exception e,也能捕获所有异常,但不推荐作为兜底——应明确区分业务异常与系统异常 - 返回值为 void 且没设置 response body,需手动调用
response.getWriter().write(...),一般不建议
不复杂但容易忽略:别忘了在配置类或启动类上确保组件扫描覆盖了 @ControllerAdvice 所在包。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











