实现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层

测试结果如下

localhost:8080/hi/1

localhost:8080/hi/2

localhost:8080/hi/3

通过以上测试发现这种全局异常实现的方式有一个缺点,就是在进入方法前就出现了异常,但全局异常类却没有捕获到此异常

全局异常处理方式二:使用特定的注解(@ControllerAdvice + @ExceptionHandler

全局异常处理类代码

 测试的controller层

测试结果如下:

localhost:8080/hi/1

localhost:8080/hi/2

localhost:8080/hi/3

注意点

 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)

posted @ 2022-08-26 16:02  追梦滴小蜗牛  阅读(2399)  评论(0编辑  收藏  举报