SpringMVC处理异常的顶级接口:HandlerExceptionResolver
,该接口的每个实现类都是处理异常的一种方式:
1)ExceptionHandlerExceptionResolver
:该子类主要提供了@ExceptionHandler
注解,并通过该注解处理异常
a)@ExceptionHandler
controller测试方法:
controller处理方法:
测试:
b)如果一个方法处理多个异常,可以这样写:
@ExceptionHandler
注解方法的参数,只能是异常类型的参数或其子类,不能是其他类型的参数,如果有其他类型的参数,则异常不会处理。如果想将异常带回页面显示,可以使用ModelAndView带回。
c)异常处理优先级
如果这个类中出现了ArithmeticException异常,则第一个方法会捕获到。
优先级:就近原则。
d)@ControllerAdvice
@ExceptionHandler只能捕获当前类中的异常,如果异常产生方法和处理方法不在一个类中,该如何?
可以自定义异常处理类,在类上使用@ControllerAdvice注解,在方法上使用@ExceptionHandler注解。
注意:如果自定义异常处理类不是放在controller包中,需要将该包加入到springmvc.xml的包扫描注解中。
2)ResponseStatusExceptionResolver
:该子类用于自定义异常显示页面,提供了@ResponseStatus
注解
可以指定状态码和原因
演示:
i.把之前的异常处理代码都注释掉,防止被拦截处理
ii.自定义exception,加上@ResponseStatus注解,只要有方法排除此异常,状态码和原因就是这里定义的。
iii.代码
iiii.测试
e)@ResponseStatus
注解也可以使用在方法上
代码:
测试:
3)DefaultHandlerExceptionResolver
:
SpringMVC在一些常见的异常(比如300,404,500)基础之上新增了一些异常,例如 405
(在RequestMapping要求POST请求,却使用get请求时会出现)
4)SimpleMappingExceptionResolver
通过配置来实现异常处理
演示:
代码:
配置(prop可以指定捕获多个):
测试:
如果想将捕获到异常对象回传,可以使用一个属性(如果不配置,默认值就是exception):