实现SpringMVC的全局异常捕获与处理的方式总结
在使用SpringMVC开发的项目中,每个Controller层里边的方法都需要进行异常捕获以及处理,这种方式太繁琐且效率低,而且大部分异常是不能够直接向外抛出,需要一个统一的错误说法,因此如果能够全局捕获异常统一进行异常处理,将会是一个好的解决方案。
大致的走向流程图
SpringMVC提供了两种全局异常捕获和处理的实现方式
第一种:自定义类并实现 HandlerExceptionResolver 接口 并实现 resolveException 方法进行处理全局异常
第二中:通过SpringMVC提供的特定注解(@ControllerAdvice + @ExceptionHandler)方式来进行处理全局异常
演示的项目环境介绍
SpringBoot项目(要加入 spring-boot-starter-web模块),JDK8
resources目录结构如下
全局异常处理方式一:自定义类并实现 HandlerExceptionResolver 接口
全局异常处理类代码
注意点:
1、类上面的@Component注解必须要加上,否则此全局自定义异常类将无法生效。
2、如果同时出现返回一个视图和通过response输出信息的行为(也就是代码注释里边的2和3步骤)response输出的级别最高
3、必须要返回一个ModelandView对象,否则SpringMVC在进行处理时会出现报错
4、通过 ModelAndView 返回一个界面时,必须要配置一个界面视图解析器不然的话也会报错,我这里使用的是
测试的Controller层
测试结果如下
通过以上测试发现这种全局异常实现的方式有一个缺点,就是在进入方法前就出现了异常,但全局异常类却没有捕获到此异常
全局异常处理方式二:使用特定的注解(@ControllerAdvice + @ExceptionHandler)
全局异常处理类代码
测试的controller层
测试结果如下:
注意点:
1、方式一和方式二并存时,方式二级别级别高
2、不同的方法,监听相同的异常类型时,会出现报错
3、有具体异常的监听类,就会执行此方法,不会再往下执行,就比如图里边的算术异常和exception异常,访问 http://localhost/hi/1 时,只会调用myHandler1 方法
关于使用 ExceptionHandler 注解的一些注意点
方法入参签名
返回值:
在实际的开发中,推荐使用第二种方式,比较灵活,也比较全面一些
本次演示代码下载地址
github:oukele/springmvc_global_exception: springmvc全局异常处理示例 (github.com)
gitee:springmvc_global_exception: springmvc的全局异常处理案例 (gitee.com)