全局异常处理

对于异常处理由全局异常处理的拦截类实现

全局异常拦截类实现:

拦截类上被RestControllerAdvice注解标注代表当前类是一个ControllerAdvice,同时类中的方法上有ExceptionHandler注解,注解的value值代表当前方法所处理的异常类型,当前拦截类中的方法个数和这些方法上注解的value值取决于系统异常的类型,一般有MethodArgumentNotValidExecption(参数校验异常)、RuntimeException(运行时异常)、Exception(托底异常)等,当业务逻辑中抛出相应异常时,会经过当前异常拦截类,由相应的方法处理,如果抛出了没被定义的异常,则被托底的Exception拦截。

拦截方法处理:

1、规范返回参数:如果没经过异常拦截类处理,前端收到的返回参数可能是一大段不符合接口定义的报错信息,拦截方法首先要做的就是规范报错信息,code和message之类的信息。

2、打印日志:对于业务发生异常被抛出controller层的时候,之前我们说的那个切面Aspect就不会走下去了,也就是在执行proceed这一行后,后面的代买不会执行,自然也不会打印日志,那么就需要在相应的异常拦截里打印日,这个时候需要去获取请求的参数,就是通过request去获取,这也是为什么在全局日志切面中需要把输入参数塞入request中。

Aspect和ControllerAdvice:

ControllerAdvice其实也就是一个特殊类,它作为Spring框架的一部分,自然也是可以被Aspect给切面的,比如在全局的异常处理类中,我们可以写一个Aspect,增强类型为AfterReturn(后置通知)型,切入点设置为“target(异常拦截类类名)”,这样我们就可以对异常拦截类做一个切面来扩展相关功能,比如上述中的日志打印,每种异常的拦截方法中都需要打印日志,那么可以在这个切面中统一处理打印日志。

注意:这里的Aspect切入点为ControllerAdvice类,并没有破坏Spring的controller -> aspect -> controllerAdvice约定,因为Spring约定里的aspect是切入点为controller的切面,而本文的aspect切入点为controllerAdvice。

posted @ 2024-02-16 15:09  leviH  阅读(24)  评论(0编辑  收藏  举报