================================
场景:
当代码出现异常时通常都需要将异常信息写入到日志中,异常信息越详细越有利于问题的排查。而通过的Exception.getMessage()方法只能获得异常的名称而不能获取哪里出现的异常,对于排错意义不大。
甚至有时候,getMessage()返回的是null。
查看getMessage()的源码:
/*** Returns the detail message string of this throwable.
*
*@returnthe detail message string of this {@codeThrowable} instance
* (which may be {@codenull}).*/
publicString getMessage() {returndetailMessage;
}
可以看到说明,与可能返回为null。
解决方法:
罗列四个解决方法
//1、
publicString getTrace(Throwable t) {
StringWriter stringWriter= newStringWriter();
PrintWriter writer= newPrintWriter(stringWriter);
t.printStackTrace(writer);
StringBuffer buffer=stringWriter.getBuffer();returnbuffer.toString();
}//2、
public staticString getExceptionAllinformation(Exception ex){
String sOut= "";
StackTraceElement[] trace=ex.getStackTrace();for(StackTraceElement s : trace) {
sOut+= "\tat " + s + "\r\n";
}returnsOut;
}//3、
public staticString getExceptionAllinformation_01(Exception ex) {
ByteArrayOutputStream out= newByteArrayOutputStream();
PrintStream pout= newPrintStream(out);
ex.printStackTrace(pout);
String ret= newString(out.toByteArray());
pout.close();try{
out.close();
}catch(Exception e) {
}returnret;
}//4、
private staticString toString_02(Throwable e){
StringWriter sw= newStringWriter();
PrintWriter pw= new PrintWriter(sw, true);
e.printStackTrace(pw);
pw.flush();
sw.flush();returnsw.toString();
}
具体使用场景:
try{
.....
}catch(Exception e){
StringWriter stringWriter= newStringWriter();
PrintWriter writer= newPrintWriter(stringWriter);
e.printStackTrace(writer);
StringBuffer buffer=stringWriter.getBuffer();
String errMsg=buffer.toString();
logger.error(errMsg);
hashMap.put("status",String.valueOf(-1));
hashMap.put("errorMsg",StringUtils.isBlank(errMsg) ? "": errMsg);
}finally{
redisUtil.HASH.hmset(recordKey,hashMap);
String lpop=redisUtil.LISTS.lpop(runTaskKey);
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>任务执行完成,执行队列"+runTaskKey+"移除:"+lpop);
hashMap.clear();
}
参考地址: