SpringMVC异常处理
SpringMVC通过HandlerExceptionResolver
处理程序的异常,包括Handler映射、数据绑定以及目标方法执行时发生的异常
SpringMVC提供的HandlerExceptionResolver
的实现类包括:
DispatcherServlet
默认装配的HandlerExceptionResolver
有:
- 没有使用
<mvc:annotation-driven/>
配置,有
AnnotationMethodHandlerExceptionResolver
(已废弃)ResponseStatusExceptionResolver
DefaultHandlerExceptionResolver
- 使用了
<mvc:annotation-driven/>
配置,有
ExceptionHandlerExceptionResolver
ResponseStatusExceptionResolver
DefaultHandlerExceptionResolver
如下所示的一个方法
/**
* 测试异常处理
* @return
*/
@RequestMapping("/testExceptionHandlerExceptionResolver")
public String testExceptionHandlerExceptionResolver(@RequestParam("i") int i){
System.out.println("result: " + (10 / i));
return "success";
}
如果url中传递的i
的值为0,这会抛出异常。如http://localhost:8080/springmvc-1/springmvc/testExceptionHandlerExceptionResolver?i=0
如何处理异常呢?
参考:
ExceptionHandlerExceptionResolver
ExceptionHandlerExceptionResolver
主要处理Handler中,用@ExceptionHandler
注解定义的方法
1.@ExceptionHandler
注解
可以将@ExceptionHandler
添加到任何控制器中,以专门处理由同一控制器中的请求处理(@RequestMapping
)方法抛出的异常
- 在
@ExceptionHandler
方法的入参中可以加入Exception
类型的参数,该参数即对应发生的异常对象 @ExceptionHandler
方法的入参不能传入Map。若希望把异常信息传导到页面上,需要使用ModalAndView
作为返回值@ExceptionHandler
方法标记的异常有优先级的问题,例如发生的是NullPointerException
,但是声明的异常有RuntimeException
和Exception
,此时会根据异常的最近继承关系找到继承深度最浅的那个@ExceptionHandler
注解方法,即标明了RuntimeException
的方法ExceptionHandlerExceptionResolver
内部若找不到@ExceptionHandler
注解的话,会找@ControllerAdvice
中的@ExceptionHandler
注解方法
如添加一个handlerArithmeticException
方法,如下:
@ExceptionHandler({ArithmeticException.class})
public ModelAndView