业务异常需要发送文件告警,但每次定位问题都要去翻日志很麻烦,但捕获到异常具体原因和类详细错误行就方便许多了~
封装方法:
public static String getErrorInfoFromException(Exception e) {
try {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
String errorMessage = sw.toString();
char [] errorMessages = sw.toString().toCharArray();
//获取异常头部信息
StringBuffer outErrorMessage = new StringBuffer();
outErrorMessage.append("\n异常类型:" + e.getMessage());
//获取异常输出各个()下标
//这里初始化10个只取前10个类信息用来定位问题,一般也够用了,定位不到的修改初始长度
int initsize = 10;
ArrayList<Integer> leftIndex = new ArrayList();
ArrayList<Integer> rightIndex = new ArrayList();
for (int i=0;i<errorMessages.length;i++){
if(errorMessages[i]=='('){
leftIndex.add(i);
}else if(errorMessages[i]==')'){
rightIndex.add(i);
}
if (rightIndex.size() == initsize) {
break;
}
}
outErrorMessage.append("\n异常详细地址:");
for(int i=0;i<leftIndex.size();i++){
outErrorMessage.append(errorMessage.substring(leftIndex.get(i)+1,rightIndex.get(i))+"\n");
}
return outErrorMessage.toString();
} catch (Exception e2) {
return "bad getErrorInfoFromException";
}
}
测试用例:
public static void main(String[] args) {
ArrayList list=null;
try {
System.out.println(list.get(5));
}catch (Exception e){
String errorInfoFromException = SendMsg.getErrorInfoFromException(e);
System.out.println(errorInfoFromException);
}
}
打印信息:
当然这里有些循环字符的性能问题,懒得优化。
如果你们有更好的办法,留言下让我学习学习。
如果文章对你有帮助给我点个赞哟!