1. SpringMVC通过HandlerExceptionResolver处理程序的异常,包括Handler映射,数据绑定以及目标方法执行时发生的异常
2.SpringMVC提供的HandlerExceptionResolver的实现类:(标注红×的已被废弃)
-- 其中被SpringMVC默认装配的
3. ExceptionHandlerExceptionResolver
-- 在@ExceptionHandler 方法的入参中可以加入Exception类型的参数,该参数即对应发生的异常对象
-- 在@ExceptionHandler方法的入参中不能传入Map。若希望把异常信息传到页面上,需要使用ModelAndView作为返回值
-- @ExceptionHandler方法标记的异常有优先级问题。优先抛出距离自己近的父类
-- @ControllerAdvice :如果在当前方法找不到@ExceptionHandler标记的方法,则去@ControllerAdvice 标记的类中寻找相应的方法
@ControllerAdvice public class ExceptionHandlerHandler { @ExceptionHandler(value= {RuntimeException.class}) public ModelAndView testExceptionHandler2(Exception ex) { System.out.println("[RuntimeException]出异常了..."); System.out.println(ex); ModelAndView mv = new ModelAndView("error"); mv.addObject("exception", ex); return mv; } @ExceptionHandler(value= {ArithmeticException.class}) public ModelAndView testExceptionHandler(Exception ex) { System.out.println("[ArithmeticException]出异常了..."); System.out.println(ex); ModelAndView mv = new ModelAndView("error"); mv.addObject("exception", ex); return mv; } }
4. ResponseStatusExceptionResolver
-- 在异常及异常父类中找到@ResponseStatus注解,然后使用这个注解的属性进行处理
-- 定义一个@ResponseStatus注解修饰的异常类
-- 若在处理器方法中抛出了上述异常:若ExceptionHandlerExceptionResolver不解析异常。由于触发的异常 UnauthorizedException带有@ResponseStatus注解。因此会被ResponseStatusExceptionResolver解析到。最后响应HttpStatus.UNAUTHORIZED代码给客户端。HttpStatus.UNAUTHORIZED代表响应码401,无权限。关于其他响应码可参考HttpStatus枚举类型源码
5. DefaultHandlerExceptionResolver
-- 对一些特殊异常进行处理,具体可参看源码,比如
6.SimpleMappingExceptionResolver
-- 如果希望对所有异常进行统一处理,可以使用SimpleMappingExceptionResolver,它将异常类名映射为视图名,即发生异常时使用对应的视图报告异常
-- SimpleMappingExceptionResolver会在requestScope请求域中放入属性“exception” 来对应所抛出的异常
可通过exceptionAttribute更改属性名
-- 若exceptionMappings 的prop的Key 为空时,将映射所有异常