SpringMVC 异常处理流程
目录
¶概述
📖系统中异常包括:编译时异常和运行时异常(RuntimeException
),前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、通过测试手段减少运行时异常的发生
✨在开发中,不管是 dao 层、service 层还是 controller 层,都有可能抛出异常,在 springmvc 中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护
¶异常处理流程
下图是 Spring MVC 的异常处理流程
如上图所示,系统的 dao、service、controller 出现异常都通过 throws Exception 向上抛出,最后由 springmvc 前端控制器交由异常处理器进行异常处理
✨springmvc 提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理
¶Spring MVC 中自带的简单异常处理器
springmvc 中自带了一个异常处理器叫 SimpleMappingExceptionResolver,该处理器实现了 HandlerExceptionResolver 接口,全局异常处理都需要实现HandlerExceptionResolver
接口
1 | <!-- springmvc提供的简单异常处理器 --> |
🎶进行配置时,最重要的是要配置特殊处理的异常,这些异常一般都是用户自定义的,并且不同的异常会促使页面跳转到不同的错误显示页面显示不同的错误信息
1 | //定义一个简单的异常类 |
📓使用 SimpleMappingExceptionResolver 进行异常处理,具有集成简单、有良好的扩展性(可以任意增加自定义的异常和异常显示页面)、对已有代码没有入侵性等优点,但该方法仅能获取到异常信息,若想要在出现异常时,进行额外操作,SimpleMappingExceptionResolver
不太合适
¶自定义全局异常处理器
⛵全局异常处理器处理思路:
- 解析出异常类型
- 如果该异常类型是系统自定义的异常,直接取出异常信息,在错误页面展示
- 如果该异常类型不是系统自定义的异常,构造一个自定义的异常类型(信息为“未知错误”)
1 | public class CustomExceptionResolver implements HandlerExceptionResolver { |
1 | <!-- 自定义的全局异常处理器 |
¶注解实现异常管理
✨异常处理主要使用三个注解:@ExceptionHandler
,@ControllerAdvice
和@RestControllerAdvice
- 使用
@ExceptionHandler
注解明确对特定的异常进行处理 @ControllerAdvice
和@RestControllerAdvice
将多个@ExceptionHandler
聚集在一起统一进行异常管理
🎶因为@ExceptionHandler
注解的方式已经足够强大,所以很少通过实现HandlerExceptionResolver
来自定义异常处理策略
¶@ExceptionHandler
✨@ExceptionHandler
注解特点
- 使用注解@ExceptionHandler 可以将一个方法指定为异常处理方法。该注解只有一个可选属性
value
,类型是Class<?>[]
,用于指定该注解的方法所要处理的异常类,即所要匹配的异常 - 被注解的方法,其返回值可以是 ModelAndView、String,或 void,方法名随意,方法参数可以是 Exception 及其子类对象、HttpServletRequest、HttpServletResponse 等。系统会自动为这些方法参数赋值
1 |
|
如果在每个 Controller 里面都写异常解析器还是很麻烦的,可以使用@RestControllerAdvice
或者@ControllerAdvice
统一处理异常
¶@RestControllerAdvice
&@ControllerAdvice
❓都能进行异常管理,@RestControllerAdvice 和@ControllerAdvice 有什么区别呢?
- @RestControllerAdvice 是在@ControllerAdvice 的基础上加了@ResponseBody 注解
- @RestControllerAdvice 返回的是 JSON,@ControllerAdvice 返回的是视图
1 |
|
🎶使用注解进行统一异常处理的注意点
- 如果能够精确定义为异常发生点,则以精确异常为准
- 如果一个异常能被多个解析器所处理,则选择继承关系最近的解析器