a.ExceptionHandlerExceptionResolver
1、@ExceptionHandler --- 统一处理一个controller中(@ExceptionHandler所在controller)的异常,局部捕获处理异常
1 @ExceptionHandler({ArithmeticException.class, NullPointerException.class}) 2 public String exception(Exception e) { 3 System.out.println(e);
4 ModelAndView mv = new ModelAndView("error");
5 mv.addObject("error", e);
6 return mv; 7 return "error"; 8 }
该注解作用对象为方法,并且在运行时有效;
该注解标识的方法不能有其他参数,所以前端想要获取异常信息,需要利用ModelAndView;
异常处理路径:最短路径优先。--- 如果有多个处理方法,根据异常的最近继承关系找到继承深度最浅的那个@ExceptionHandler注解方法
2、@ControllerAdvice --- 全局捕获处理异常 -- 注意spring版本,低版本可能不兼容,我一开始用的3.2.0不行,然后改成3.2.3不行,最后选择了4.3.18(我可是因为这个问题浪费了一个上午)
1 @ControllerAdvice 2 public class exceptionHandler { 3 4 @ExceptionHandler(ArrayIndexOutOfBoundsException.class) 5 public ModelAndView arrayIndexOutOfBoundsException(ArrayIndexOutOfBoundsException e) { 6 System.out.println(e); 7 ModelAndView mv = new ModelAndView("error"); 8 mv.addObject("error", e); 9 return mv; 10 } 11 }
不要忘记spring配置文件配置<mvc:annotation-driven></mvc:annotation-driven>
b.ResponseStatusExceptionResolver ----自定义异常显示页面,类似404
@ResponseStatus(value=HttpStatus.xxx,reason="自己定义")
SimpleMappingExceptionResolver --- 通过配置文件捕获异常(看教程的代码,我没有实现)
1 <!-- 通过SimpleMappingExceptionResolver 捕获异常 --> 2 <bean class="org.springframework.web.portlet.handler.SimpleMappingExceptionResolver"> 3 <property name="exceptionMappings"> 4 <props> 5 <prop key="java.lang.ArrayIndexOutOfBoundsException"> 6 <!-- 跳转到error.jsp页面 --> 7 error 8 </prop> 9 </props> 10 </property> 11 </bean>