前言
在做项目的时候,我们难免会遇到异常,常用的做法就是使用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小菜鸟一枚,现在也是刚刚找到实习工作,以前也没怎么写过文章,希望以后能坚持下去,加油!!如果有没有说对的地方,还请大家批评指正。