SpringMVC异常处理 Dear 丶 2022-05-09 07:16 201阅读 0赞 在Spring MVC中,所有用于处理在请求映射和请求处理过程中抛出的异常的类,都要实现 HandlerExceptionResolver 接口。 一个基于Spring MVC的Web应用程序中,可以存在多个实现了HandlerExceptionResolver的异常处理类,**他们的执行顺序,由其order属性决定, order值越小,越是优先执行**, 在执行到第一个返回不是null的ModelAndView的Resolver时,不再执行后续的尚未执行的Resolver的异常处理方法。 平常开发的时候,我一般都会配置:<mvc:annotation-driven />,使用了这个配置标签,SpringMVC会默认配置: ![70][] ### 一、ExceptionHandlerExceptionResolver接口 ### 在该 controller 类中使用@ExceptionHandler(value= \{ 大Class数组 \}) : 根据异常需求写大Class //http://127.0.0.1:8080/sshweb/textex?num=1 @RequestMapping(value="/textex") public String textex(@RequestParam("num") int num) { System.out.println("商为:" + 10/num); return "redirect: /sshweb/users"; } // 必须使用ModelAndView, 而不是String, 否则 无法渲染试图 @ExceptionHandler(value= {ArithmeticException.class}) public ModelAndView HandlerEX(Exception e) { System.out.println("出异常了---" + e.getMessage()); ModelAndView mv = new ModelAndView(); mv.addObject("ex", e.getMessage()); mv.setViewName("error"); return mv; } 要把异常信息注入到 error.jsp 页面, 必须返回 ModelAndView。 <body> <h4>错误页面</h4> 异常信息为: ${ex } </body> ![70 1][] 需要注意的是,上面例子中的ExceptionHandler方法的作用域,只是在本Controller类中。 **如果需要使用ExceptionHandler来处理全局的Exception,则创建一个类需要使用@ControllerAdvice注解。** 自定义 HandlerGlobalEX 类: 处理全局的(ArithmeticException.class,RuntimeException.class) @ControllerAdvice public class HandlerGlobalEX{ // 必须使用ModelAndView, 而不是String, 否则 无法渲染试图 @ExceptionHandler(value= {ArithmeticException.class,RuntimeException.class}) public ModelAndView HandlerEX(Exception e) { System.out.println("出异常了---" + e.getMessage()); ModelAndView mv = new ModelAndView(); mv.addObject("ex", e.getMessage()); mv.setViewName("error"); return mv; } } ## ## ### 二、SimpleMappingExceptionResolver,不用自己写处理异常类,直接配置就ok: ### **1) springmvc.xml 配置文件中配置异常处理器:** <!-- 配置全局异常处理的处理器: --> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- 配置order为-1,表示优先级最高 --> <property name="order" value="-1" /> <!-- 定义默认的异常处理页面,当该异常类型的注册时使用 --> <property name="defaultErrorView" value="error"></property> <!-- 不写exceptionAttribute,默认的异常信息的引用名:exception,可修改 --> <property name="exceptionAttribute" value="ex"></property> <!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常页名作为值 --> <property name="exceptionMappings"> <props> <prop key="java.lang.RuntimeException">error-runtime</prop> <prop key="java.lang.ArithmeticException">error-arith</prop> <!-- 这里还可以继续扩展对不同异常类型的处理 --> </props> </property> </bean> SimpleMappingExceptionResolver 会把异常信息注入到error.jsp页面,默认异常信息的引用名:exception,这个默认名字是可以通过 <property name="exceptionAttribute" value="ex"></property> 修改. **2) error-arith.jsp :** <body> <h4>算数异常</h4> 异常信息为: ${ex } <br/> 异常信息为: ${exception } <br/> 异常信息为: ${ex.message } </body> ![70 2][] ![70 3][] 附一张图(来自网络): **SpringMVC的请求处理的全过程示意图** ![70 4][] [70]: /images/20220509/0d94d1d6a524488a85c30fc5de7d2b59.png [70 1]: /images/20220509/8608bdb2c66843fd9240c8a25c7aeccb.png [70 2]: https://img-blog.csdn.net/20181004132623964?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNDAyODU0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70 [70 3]: /images/20220509/947016a8571246ab94b5a5d20fcacfa2.png [70 4]: /images/20220509/9b1b588a51c74012a955339c0a3728fb.png
还没有评论,来说两句吧...