在实际的项目中,会遇到各种各样的异常,我们要排错的时候,借助错误的堆栈信息往往能更快的排错,所以可以把错误堆栈信息写到日志里面去,方便于看线上的错误日志,更快的排错。
1、使用 io 流将堆栈信息打印出来
public static StringgetStackTraceInfo(Exception e){
StringWriter sw =null;
PrintWriter pw =null;
try {
sw =new StringWriter();
pw =new PrintWriter(sw);
//将出错的栈信息输出到printWriter中
e.printStackTrace(pw);
pw.flush();
sw.flush();
}finally {
if (sw !=null) {
try {
sw.close();
}catch (IOException e1) {
e1.printStackTrace();
}
}
if (pw !=null) {
pw.close();
}
}
if(sw!=null){
return sw.toString();
}else{
return null;
}
}
2、使用 common-lang3 提供的工具类
在 common-lang3 包中提供了 ExceptionUtils 类来帮助读取堆栈信息
pom 依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.5</version>
</dependency>
public static String getStackTraceV2(Exception e) {
return org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);
}
看一下源码咋实现的:
//-----------------------------------------------------------------------
/**
* <p>Gets the stack trace from a Throwable as a String.</p>
*
* <p>The result of this method vary by JDK version as this method
* uses {@link Throwable#printStackTrace(java.io.PrintWriter)}.
* On JDK1.3 and earlier, the cause exception will not be shown
* unless the specified throwable alters printStackTrace.</p>
*
* @param throwable the <code>Throwable</code> to be examined
* @return the stack trace as generated by the exception's
* <code>printStackTrace(PrintWriter)</code> method
*/
public static String getStackTrace(final Throwable throwable) {
final StringWriter sw = new StringWriter();
final PrintWriter pw = new PrintWriter(sw, true);
throwable.printStackTrace(pw);
return sw.getBuffer().toString();
}
和第一种方法一样,所以很多东西,别人已经造好轮子了,我们可以直接使用,但是我们也要明白其实现原理。
以下是实际项目中的使用,采用第二种方法:
try {
…………………………
…………………………
}
}catch (Exception e) {
log.error("系统定时验票:Util.invoiceCheck这边发生异常:{}",org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e));
e.printStackTrace();
}