Spring MVC异常处理
Spring MVC 有以下 3 种处理异常的方式:
局部异常处理仅能处理指定 Controller 中的异常。
示例 1:下面使用 @ExceptionHandler 注解实现。定义一个处理过程中可能会存在异常情况的 testExceptionHandle 方法。
@RequestMapping( /testExceptionHandle ) public String testExceptionHandle(@RequestParam( i ) Integer i) { System.out.println(10 / i); return success }
显然,当 i=0 时会产生算术运算异常。
下面在同一个类中定义处理异常的方法。
@ExceptionHandler({ ArithmeticException.class }) public String testArithmeticException(Exception e) { System.out.println( 打印错误信息 === ArithmeticException: + e); // 跳转到指定页面 return error }
注意:该注解不是加在产生异常的方法上,而是加在处理异常的方法上。
异常页面 error.jsp 代码如下。
%@ page language= java contentType= text/html; charset=UTF-8 pageEncoding= UTF-8 % !DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN http://www.w3.org/TR/html4/loose.dtd html head meta http-equiv= Content-Type content= text/html; charset=UTF-8 title 错误页面 /title /head body 发生算术运算异常,请重新输出数据! /body /html
访问地址:http://localhost:8080/springmvcDemo2/testExceptionHandle?i=0,页面跳转到 error.jsp 页面,运行结果如图 1 所示。
![error.jsp页面](http://ytso-blog-oss-img.oss-cn-beijing.aliyuncs.com/wp-content/uploads/2021/07/16/20210716_60f1a16a89805.png)
图 1:error.jsp页面
控制器输出结果如下。
打印错误信息 === ArithmeticException:java.lang.ArithmeticException: / by zero
@ExceptionHandler 注解定义的方法优先级问题:例如发生的是 NullPointerException,但是声明的异常有 RuntimeException 和 Exception,这时候会根据异常的最近继承关系找到继承深度最浅的那个@ExceptionHandler 注解方法,即标记了 RuntimeException 的方法。
被 @ExceptionHandler 标记为异常处理方法,不能在方法中设置别的形参。但是可以使用 ModelAndView 向前台传递数据。
使用局部异常处理,仅能处理某个 Controller 中的异常,若需要对所有异常进行统一处理,可使用以下两种方法。
2. HandlerExceptionResolverSpring MVC 通过 HandlerExceptionResolver 处理程序异常,包括处理器异常、数据绑定异常以及控制器执行时发生的异常。HandlerExceptionResolver 仅有一个接口方法,源码如下。
public interface HandlerExceptionResolver { @Nullable ModelAndView resolveException( HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex); }
发生异常时,Spring MVC 会调用 resolveException() 方法,并转到 ModelAndView 对应的视图中,返回一个异常报告页面反馈给用户。
示例 2:在 net.biancheng.exception 包中创建一个 HandlerExceptionResolver 接口的实现类 MyExceptionHandler,代码如下。
package net.biancheng.exception; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; public class MyExceptionHandler implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) { Map String, Object model = new HashMap String, Object // 根据不同错误转向不同页面(统一处理),即异常与View的对应关系 if (arg3 instanceof ArithmeticException) { return new ModelAndView( error , model); return new ModelAndView( error-2 , model); }
在 springmvc-servlet.xml 文件中添加以下代码。
!--托管MyExceptionHandler-- bean >再次访问 http://localhost:8080/springmvcDemo2/testExceptionHandle?i=0,页面跳转到 error.jsp 页面,运行结果如上图 1 所示。
3. SimpleMappingExceptionResolver全局异常处理可使用 SimpleMappingExceptionResolver 来实现。它将异常类名映射为视图名,即发生异常时使用对应的视图报告异常。
示例 3:在 springmvc-servlet.xml 中配置全局异常,代码如下。
bean >再次访问 http://localhost:8080/springmvcDemo2/testExceptionHandle?i=0,页面跳转到 error.jsp 页面,运行结果如上图 1 所示。
4618.html
springSpring CloudSpring DataSpring frameworkSpring SecuritySpringBootSpringMVC
相关文章
- Spring学习笔记(十)——SpringMVC框架中的拦截器和异常处理
- spring boot自动配置原理面试题_Spring boot面试
- java面试题 --- Spring②
- 一文入门 Spring Cloud Tencent
- 哪些异常是RuntimeException?Sql异常属于RuntimeException吗?Spring下SQL异常事务回滚
- spring注解有哪些_Spring 注解
- Spring MVC框架:第五章:静态资源访问与mvc:view-controller
- spring官方文档 中文_Spring软件
- Spring Cloud Ribbon
- Spring的事务我是这么玩的
- Spring监听器-spring源码详解(五)
- spring异常:No runnable methods 解决方法
- Spring之XML 配置AOP 事务管理
- Spring Cloud Bus监听服务配置的变化并自动通知其他服务(一)
- Spring Batch 核心概念ItemProcessor
- spring的AOP(五)—-Spring AOP 编程(AspectJ )详解编程语言
- Spring异常重试框架Spring Retry详解编程语言
- Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例详解编程语言
- Spring Boot(十二):spring boot如何测试打包部署详解编程语言
- Spring MVC统一异常处理的3种方式(附带实例)
- Spring queryForInt方法:int类型单值查询
- spring架构利器:JFinal MySQL Spring(jfinalmysql)
- Spring Boot 2.x 系列教程:WebFlux REST API 全局异常处理 Error Handling