ExceptionHander注解
用来定义一个一场处理的方法,用于处理在同一个Controller中的其他的方法抛出来的异常
@RequestMapping("/exceptionHandler") public void testExceptionHander(){ System.out.println("123"); throw new MailSendException("123"); } @ExceptionHandler(value = MailSendException.class) public String handleException(){ System.out.println("空指针异常处理"); return "error"; }
如果以想要吧异常信息显示到网页上,需要传入Exception的参数,但是这个参数不能被放到Model/Map里面,只能使用ModelandView来处理
@ExceptionHandler(value = MailSendException.class) public ModelAndView handleException(Exception ex){ ModelAndView modelAndView=new ModelAndView(); modelAndView.setViewName("error"); modelAndView.addObject("ex",ex); return modelAndView; }
注解中如果不加上限定的参数,那么就是可以捕获本Controller中所有的异常
这样写的话,这个异常处理方法,只能在本Controller中使用,要想全局使用,需要注解@ControllerAdvice
这个注解应用在类上,这样类中的@EXceptionhandler就能应用到所有@RequestMapping注解的方法上,
当出现异常的时候,首先在自己的Controller中找处理方法,找不到的话就去@ControllerAdvice中找处理方法。
注意EXceptionhandler的精确度问题,出现异常之后,回去匹配最为精确描述的那个处理方法。
ControllerAdvice的注解本身,就有Component的注解,注意要扫描到包的位置!
ResponseStatusExceptionResolver——ResponseStatus注解
这个注解对于自定义的异常很有用,在自定义的异常上添加这个注解,可以指定异常返回的状态码以及提示信息。
如果放在方法上,就呵呵,无论方法是否出异常,都会跳转到错误页面(定制的),如果没有异常,方法会正常执行,但会跳转异常
@ResponseStatus(code = HttpStatus.BAD_GATEWAY,reason = "测试ResponseStatus注解的异常提示信息") public class MyException extends ArrayIndexOutOfBoundsException { }
SimpleMappingExceptionResolver
用来全局处理异常,根据异常的类型,指定跳转到不同的页面去,并且自动将异常对象传入到指定页面的model中
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props > <prop key="java.lang.NullPointerException">error</prop> <!-- 这里可以继续指定 --> </props> </property> <!-- 对于没有指定映射的异常,统一跳转 --> <property name="defaultErrorView" value="defaulterror"/> <!-- 异常会被放到model中,默认的异常对象的名字是exception,这里个性化了一下 --> <property name="exceptionAttribute" value="ex"/> </bean>
只需要在Spring配置文件中创建一个bean就可以了,指定异常处理的property,也可以指定默认的跳转位置