当我们使用try..catch方法(如下图所示)捕获到异常堆栈信息时,有时候无法打印出具体的错误信息到日志文件,即无法通过抛出的异常迅速定位到问题所在。因此我们需要将异常堆栈信息通过某种方法解析出来,输出完整正确的日志信息。
try{
//do something
}catch(Exception ex){
ex.printStackTrace();
}
工作中经常会碰到以上情况,因此我将以上的解决办法抽象出了工具方法,供大家参考调用。
public class ExcpUtil {
//打印异常堆栈信息
public static String getStackTraceString(Throwable ex){//(Exception ex) {
StackTraceElement[] traceElements = ex.getStackTrace();
StringBuilder traceBuilder = new StringBuilder();
if (traceElements != null && traceElements.length > 0) {
for (StackTraceElement traceElement : traceElements) {
traceBuilder.append(traceElement.toString());
traceBuilder.append("\n");
}
}
return traceBuilder.toString();
}
//构造异常堆栈信息
public static String buildErrorMessage(Exception ex) {
String result;
String stackTrace = getStackTraceString(ex);
String exceptionType = ex.toString();
String exceptionMessage = ex.getMessage();
result = String.format("%s : %s \r\n %s", exceptionType, exceptionMessage, stackTrace);
return result;
}
}
运用场景:
Example1:
try {
//do something
} catch (Exception ex) {
logger.info(ex.toString());
logger.info("work exception" + ExcpUtil.getStackTraceString(ex));
}
Example2:
try {
//do something
} catch (Exception e) {
throw new CSException (ErrorCode.DEFAULT_ERR,"ctrip_SendEmail exception", ExcpUtil.buildErrorMessage(e));
}