@exceptionhandler用于控制器内局部异常处理,仅捕获当前controller未被吞掉的异常,支持具体异常类型、@responsestatus或responseentity返回响应。

在 Spring MVC 中,@ExceptionHandler 可以在控制器(@Controller 或 @RestController)内部定义局部异常处理逻辑,只对当前 Controller 中抛出的异常生效,不干扰其他控制器。
声明局部异常处理器方法
在某个 Controller 类中,添加一个用 @ExceptionHandler 标注的方法,参数可接收具体异常类型(如 IllegalArgumentException),返回值通常是 ResponseEntity 或普通对象(配合 @ResponseBody)。
- 方法必须是非 private 的,且不能是 static
- 可以接收
Exception、具体子类、甚至多个异常类型(用数组形式:@ExceptionHandler({IOException.class, SQLException.class})) - 推荐使用具体异常类型,避免捕获太宽泛(如直接捕获
Exception),便于精准响应
配合 @ResponseStatus 或 ResponseEntity 返回状态码
局部处理时,常需返回特定 HTTP 状态码。有两种主流方式:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 在方法上加
@ResponseStatus(HttpStatus.BAD_REQUEST):适合固定状态码,但无法动态判断 - 返回
ResponseEntity>:更灵活,可在运行时决定状态码和响应体,例如:return ResponseEntity.status(HttpStatus.UNPROCESSABLE_ENTITY).body("参数校验失败");
注意异常传播范围
@ExceptionHandler 只捕获当前 Controller 中直接抛出的异常,或由该 Controller 调用的服务方法抛出、未被中途捕获的异常。
- 若某 Service 方法内已用 try-catch 吞掉异常,Controller 就收不到,自然不会触发
@ExceptionHandler - 若 Controller 中调用了另一个 Controller 的方法(不推荐),也不会触发目标 Controller 的
@ExceptionHandler - 全局异常处理器(
@ControllerAdvice)优先级低于局部,只有局部没匹配时才生效
示例:一个带局部异常处理的 REST Controller
(以下为精简示意,非完整可运行代码)
@RestController
public class UserController {
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
if (id handleIllegalArgument(IllegalArgumentException e) {
return ResponseEntity.badRequest().body("请求参数错误:" + e.getMessage());
}
}Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










