场景描述:
公司内部的一些微服务偶尔会出现问题,服务请求超时或一些其他问题。因此需要做一个服务监控的模块,每小时对服务接口进行测试,如果 出现异常则发送邮件给管理员。
方案一:
@ControllerAdvice和ExceptionHandler实现Controler层的异常捕捉并处理
ControllerAdvice注解配置了一个全局异常注解类,来统一处理controller层的异常,ExceptionHandler注解标记的方法实现而且controller层中也可以不用写try/catch,使得代码更加简洁。如果使用try/catch,则需要在catch块中将异常抛出,否则会捕捉不到。
优点:将controller层的异常和数据校验的异常进行统一处理,减少模板代码,提升扩展性和可维护性。
缺点:只能捕获controller层未捕获或抛出的异常,对于Interception(拦截器)和spring框架其他层的异常无能为例。
由于上述缺点,只能捕获controller层的异常,也就是针对每个接口的requestMapping下的异常,需要前端传入httprequest对象,但是本次需求是写一个定时任务,用到的是@Scheduled注解,需要标注在无参的方法上定时运行,只要启动springboot项目后便可以运行方法,因此需要另寻他法。
方案二:
基于Aop实现异常的增强处理(@Aspect和@AfterThrowing注解)
首先写一个捕捉到异常后进行增强处理的类,使用@Aspect标记为切面。编写方法表示捕捉到异常后进行的逻辑,标记@AfterThrowing,属性内需要写明切点,一般是写到包的层次,表示该包下的异常抛出后会被执行afterThrowing的逻辑。
@AfterThrowing(pointcut = "execution(* com.xxxxx.service..*.*(..))",throwing = "e")
public void handle (Exception e){
//处理逻辑
}