@exceptionhandler仅作用于当前控制器,需配合@controlleradvice实现全局异常处理;支持参数注入和多种返回类型,须手动设置http状态码以确保正确响应。

@ExceptionHandler 是 Spring MVC 中用于统一处理控制器(@Controller 或 @RestController)中抛出异常的注解,它让异常处理逻辑与业务代码分离,提升可维护性和一致性。
作用范围:仅对当前控制器生效
标注在控制器类内的方法上,该方法只捕获当前控制器中抛出的指定类型异常。例如:
- 一个
@Controller类里定义了@ExceptionHandler(NullPointerException.class)方法,它不会处理其他控制器里的空指针异常。 - 若想全局生效,需配合
@ControllerAdvice使用(见下文)。
基本用法:在控制器内定义处理方法
方法参数可以接收异常对象、HttpServletRequest、HttpServletResponse、Model 等;返回值支持 String(视图名)、ResponseEntity、@ResponseBody 对象等:
@Controller
public class UserController {
@GetMapping("/user/{id}")
public String getUser(@PathVariable Long id) {
if (id == null) throw new IllegalArgumentException("ID 不能为空");
return "user-detail";
}
@ExceptionHandler(IllegalArgumentException.class)
public String handleIllegalArgument(IllegalArgumentException e, Model model) {
model.addAttribute("errorMessage", e.getMessage());
return "error-page";
}
}
全局异常处理:搭配 @ControllerAdvice
把 @ExceptionHandler 放在被 @ControllerAdvice 标注的类中,即可实现跨所有控制器的统一异常拦截:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(NullPointerException.class)
@ResponseBody
public ResponseEntity<string> handleNPE(NullPointerException e) {
return ResponseEntity.status(500).body("服务器内部错误:" + e.getMessage());
}
@ExceptionHandler(Exception.class)
public String handleGeneral(Exception e, Model model) {
model.addAttribute("error", "未知错误,请稍后重试");
return "common-error";
}
}</string>
-
@ControllerAdvice默认对所有@Controller生效,也可通过basePackages或assignableTypes限定范围。 - 多个
@ExceptionHandler方法之间遵循“最具体优先”原则(如IOException比Exception更具体)。
注意返回值和响应状态码
Spring 不会自动设置 HTTP 状态码,需手动指定:
- 用
ResponseEntity可同时设状态码和响应体。 - 用
@ResponseStatus(code = HttpStatus.NOT_FOUND)注解在方法上,适用于简单场景(但不支持动态状态码)。 - 若返回视图名且未设状态码,HTTP 响应默认为 200,前端可能无法识别错误;建议显式控制。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











