AOP实现异常信息的记录

128 阅读2分钟

前言

在做项目的时候,我们难免会遇到异常,常用的做法就是使用try{}catch{}来处理或者直接throws抛出异常。但今天我做项目的时候遇到这样一个需求:我在项目中许多方法中都使用了restTemplate,有时候返回过来状态码会是400,405等错误,程序抛出异常,整个程序就会停止,我就想把异常信息存入到数据库,然后让程序继续执行。

思考过程

最先想到的就是用在catch里面捕获异常,捕获到后就将异常信息存入数据库。但因为项目中有很多地方都使用到了restTemplate,相同的代码就会写很多次。之后想到可以用之前实习面试的时候经常背的spring的aop理念,用一个自定义的ExceptionLog注解,用切面实现注解,就能在需要的地方加上注解就行了,方便多了😎。

代码实现

@Component
public class ExceptionLogAspect {
   @Autowired
   private ExceptionMapper exceptionMapper;
   
   @Around("@annotation(exceptionLog)")
   public Object around(ProceedingJoinPoint point, ExceptionLog exceptionLog) {
      Object response = null;
      try {
         // 程序执行,如果遇到异常则将异常记录的数据库
         response = point.proceed();
      } catch (Throwable throwable) {
         String className = point.getTarget().getClass().getName(); // 类名
         String modular = className.split("[.]")[2]; // 模块名
         String methodName = point.getSignature().getName(); // 方法名
         Object[] args = point.getArgs(); // 参数
         String message = throwable.toString(); // 异常信息
         // 构建异常实体类
         Exception exception = new Exception();
         exception.setClassName(className);
         exception.setModular(modular);
         exception.setMethodName(methodName);
         exception.setDescription(message);
         int n = args.length; // 参数的数量
         // 目前最多设置的4个参数
         if (n > 0) {
            exception.setParam1(args[0].toString());
            if (n > 1) {
               exception.setParam2(args[1].toString());
               if (n > 2) {
                  exception.setParam3(args[2].toString());
                  if (n > 3) {
                     exception.setParam4(args[3].toString());
                  }
               }
            }
         }
         // 将异常信息保存到数据库
         exceptionMapper.insert(exception);
      }
      return response;
   }
}

问题错误

后面用了这个方法后,本来一切都挺正常的,但后面遇到一个方法注解始终都不起作用,后面搞了一天实在解决不了,就去问了带我的师兄,他先开始叫我在切面里面加上断点,发现程序根本就没进来,后面才发现我是用的方法A调用的方法B,方法B上调用的restTemplate加上了注解,但在方法A上我就没有加注解,所以方法根本就没有加上切点,我真是哭了😭。师兄:“那肯定要在A上加呀,因为主线程是A,切点是在A上”。

结束

作者目前Java小菜鸟一枚,现在也是刚刚找到实习工作,以前也没怎么写过文章,希望以后能坚持下去,加油!!如果有没有说对的地方,还请大家批评指正。