局部异常处理器专用于某个controller内部,使用@exceptionhandler注解捕获指定异常,需满足三条件:类标注@controller/@restcontroller、方法加注解并指定异常类型、方法非private;支持多异常、就近匹配、model传参推荐。

在 Spring MVC 中,局部异常处理器专用于某个 Controller 内部,只捕获该控制器中方法抛出的指定异常,不干扰其他控制器。核心是使用 @ExceptionHandler 注解,它让异常处理逻辑与业务逻辑紧耦合、高内聚,适合处理和当前业务强相关的错误场景(比如登录失败、参数校验不通过等)。
在控制器中定义异常处理方法
需满足三个条件:方法必须在标注了 @Controller 或 @RestController 的类中;方法上加 @ExceptionHandler 并指定要捕获的异常类型;方法参数可接收异常对象、HttpServletRequest、Model、HttpServletResponse 等常见 Web 对象。
- 支持单个或多个异常类型,例如:
@ExceptionHandler({NullPointerException.class, IllegalArgumentException.class}) - 异常处理方法不能是
private,且返回值可以是String(视图名)、ModelAndView、@ResponseBody结果等 - 若一个控制器中有多个
@ExceptionHandler方法,Spring 按异常继承关系就近匹配——子类异常优先被更具体的处理方法捕获
把异常信息传递给前端页面
通常用 Model 或 HttpServletRequest 将错误提示存入请求作用域,再在 JSP/Thymeleaf 页面中读取展示。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 使用
Model方式(推荐):model.addAttribute("errorMessage", e.getMessage()),页面中写${errorMessage} - 使用
HttpServletRequest方式:request.setAttribute("ex", e),页面中写${ex.message} - 注意:JSP 中若用
${exception.message},那是全局配置SimpleMappingExceptionResolver的默认行为,局部处理时不用依赖这个
确保异常能被正确捕获
局部处理只对“从该 Controller 方法中向上抛出”的异常生效。以下情况不会触发:
- 异常在 Service 层被 try-catch 吞掉,未继续上抛
- 异常发生在拦截器(Interceptor)、过滤器(Filter)或 AOP 增强中,未到达 Controller 方法体
- 方法本身没有抛出对应类型的异常(比如写了
@ExceptionHandler(NullPointerException.class),但实际抛的是RuntimeException子类以外的异常) - 控制器类未被 Spring 扫描到(缺少
@Controller或包路径未包含在<component-scan></component-scan>中)
一个完整示例
假设用户 ID 为负数时抛出异常:
- 控制器方法中:
if (id - 同个类中添加处理方法:
@ExceptionHandler(IllegalArgumentException.class)<br>public String handleInvalidId(IllegalArgumentException e, Model model) {<br> model.addAttribute("errorMessage", e.getMessage());<br> return "error";<br>} - 访问
/user/-5时,自动跳转到error.jsp,并显示 “ID 不能为负数”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










