- 主要处理 Handler 中用 @ExceptionHandler 注解定义的方法。
- @ExceptionHandler 注解定义的方法优先级问题:例如发生的是NullPointerException,但是声明的异常有 RuntimeException 和 Exception,此候会根据异常的最近继承关系找到继承深度最浅的那个 @ExceptionHandler 注解方法,即标记了 RuntimeException 的方法
- ExceptionHandlerMethodResolver 内部若找不到@ExceptionHandler 注解的话,会找 @ControllerAdvice 中的@ExceptionHandler 注解方法
1 实验代码
- 页面链接
<a href=”testExceptionHandlerExceptionResolver?i=1″>testExceptionHandlerExceptionResolver</a> |
- 控制器方法
package com.atguigu.springmvc.crud.handlers;
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam;
@Controller public class ExceptionHandler { @RequestMapping(“/testExceptionHandlerExceptionResolver”) public String testExceptionHandlerExceptionResolver(@RequestParam(“i”) int i){ System.out.println(“10/”+i+”=”+(10/i)); return “success”; } } |
- 测试,出现异常情况
处理异常,跳转到error.jsp
- 在控制器中增加处理异常的方法
@ExceptionHandler(value={java.lang.ArithmeticException.class}) public String handleException(Exception ex){ System.out.println(“出现异常啦L”+ex); return “error“; } |
- 增加jsp
<h3>Error Page</h3> |
2 如何将异常对象从控制器携带给页面,做异常信息的获取
- 异常对象不能通过Map集合方式传递给成功页面。(Map不可以)
// @ExceptionHandler(value={java.lang.ArithmeticException.class}) public String handleException(Exception ex,Map<String,Object> map){ System.out.println(“出现异常啦:”+ex); map.put(“exception”,ex); return “error”; } |
- 可以通过ModelAndView将异常对象传递给成功页面上
@ExceptionHandler(value={java.lang.ArithmeticException.class}) public ModelAndView handleException(Exception ex){ System.out.println(“出现异常啦:”+ex); ModelAndView mv = new ModelAndView(“error”); mv.addObject(“exception“, ex); return mv; } |
13.3.3匹配异常类型,执行顺序问题
@ExceptionHandler(value={java.lang.ArithmeticException.class}) public ModelAndView handleException(Exception ex){ System.out.println(“出现异常啦:”+ex); ModelAndView mv = new ModelAndView(“error”); mv.addObject(“exception“, ex); return mv; }
@ExceptionHandler(value={java.lang.RuntimeException.class}) public ModelAndView handleException2(Exception ex){ System.out.println(“RuntimeException-出现异常啦:”+ex); ModelAndView mv = new ModelAndView(“error”); mv.addObject(“exception“, ex); return mv; } |
13.3.4 公共的处理异常的类@ControllerAdvice
- 定义公共的处理异常的类
package com.atguigu.springmvc.exceptionAdvice;
import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.ModelAndView;
@ControllerAdvice public class ExceptionAdviceHandler {
/* @ExceptionHandler(value={java.lang.ArithmeticException.class}) public ModelAndView handleException(Exception ex){
System.out.println(“出现异常啦:”+ex); ModelAndView mv = new ModelAndView(“error”); mv.addObject(“exception”, ex);
return mv; }*/
@ExceptionHandler(value={java.lang.RuntimeException.class}) public ModelAndView handleException2(Exception ex){
System.out.println(“RuntimeException-出现异常啦:”+ex); ModelAndView mv = new ModelAndView(“error”); mv.addObject(“exception”, ex); //error.jsp -> ${requestScope.exception}
return mv; } } |
上一篇: java培训异常处理之HandlerExceptionResolver
下一篇: java培训课程之异常处理_ResponseStatusExceptionResolver