今天在做接口调用的时候出现一个严重bug,造成了死循环的后果,记录一下相关的错误详情
首先描述一下业务需求:
两个接口 :1 获取数据接口(下面简称A) 2 通知处理结果接口(下面简称B)
定时任务调用A接口获取数据,分条处理,处理完成后调用B接口通知处理完成,再次调用A接口获取时,会忽略调用过B接口的数据,考虑到方法处理中会出现异常,整个方法用try-catch包裹,抓到异常的时候同样调用B接口通知。
问题来了,调用B接口的时候有一个字段是"errorMessage",我在catch块里面放入了e.getMessage(),代码如下
catch (Exception e) {
reObj.put("errorMessage",e.getMessage());
reObj.put("errorCode","-3");
}
我以为不会出现问题,谁知道马上就面临了社会的毒打。
在逻辑处理的过程中,产生了空指针异常,而空指针异常这种运行期异常,e.getMessage()返回的是null,并且json在put的值是null的时候,不会做任何处理,直接就是空的
这种情况就导致了我调用的B接口不能通过,调用A接口的时候继续返回上一次未通过的数据,然后继续空指针,继续B接口不通过。。。。。。子子孙孙无穷匮也。。。。
最后,自己写一个方法去处理异常,确保不会返回null
public static String exceptionToString(Throwable t) {
StringBuilder buf = new StringBuilder();
if (t.getCause() != null) {
buf.append(exceptionToString(t.getCause()));
}
buf.append("Exception class : " + t.getClass().getName());
buf.append("\r\n");
if (!t.getMessage().equals("")) {
buf.append(t.getMessage());
buf.append("\r\n");
}
for (int i = 0; i < t.getStackTrace().length; i++) {
buf.append(t.getStackTrace()[i].toString()).append("\r\n");
}
return buf.toString();
}