2009-08-18 58 views
10

Java的e.printStackTrace()不打印内部异常的堆栈跟踪的所有细节。获取完整的字符串堆栈跟踪,包括内部异常

是否有现成的方式来生成字符串形式的完整堆栈跟踪? (除了格式化它自己)

编辑

我刚刚发现了什么的printStackTrace()做 - 显然堆栈帧它过滤掉正是共同的内部异常和外一个的人。所以实际上它就是我想要的,而不是“完整的”堆栈跟踪。

+0

你的意思是 - 内部异常的堆栈跟踪?捕获的异常是否在另一个异常中传播? – Everyone 2009-08-18 10:10:49

+0

东西是由一个catch产生的......抛出新的异常(“foo”,e) – ripper234 2009-08-18 11:27:23

+0

我刚刚发现了printStackTrace()所做的 - 显然它滤出的堆栈帧恰好是内部异常和外部一。所以实际上它就是我想要的,而不是“完整的”堆栈跟踪。 – ripper234 2009-08-18 11:52:36

回答

8

我结束了我自己的滚动(我把Throwable.printStackTrace()的执行和调整了一点):

public static String joinStackTrace(Throwable e) { 
    StringWriter writer = null; 
    try { 
     writer = new StringWriter(); 
     joinStackTrace(e, writer); 
     return writer.toString(); 
    } 
    finally { 
     if (writer != null) 
      try { 
       writer.close(); 
      } catch (IOException e1) { 
       // ignore 
      } 
    } 
} 

public static void joinStackTrace(Throwable e, StringWriter writer) { 
    PrintWriter printer = null; 
    try { 
     printer = new PrintWriter(writer); 

     while (e != null) { 

      printer.println(e); 
      StackTraceElement[] trace = e.getStackTrace(); 
      for (int i = 0; i < trace.length; i++) 
       printer.println("\tat " + trace[i]); 

      e = e.getCause(); 
      if (e != null) 
       printer.println("Caused by:\r\n"); 
     } 
    } 
    finally { 
     if (printer != null) 
      printer.close(); 
    } 
} 
9

我建议您使用Apache Commons lang中的ExceptionUtils类,它为此提供了有用的方法。

+0

实际上,getFullStacktrace()仍然不打印内部堆栈跟踪。 – ripper234 2009-08-18 11:25:36

+0

不幸的是,没有printFullStacktrace()方法,但可以执行System.err.println(getFullStacktrace()); – romaintaz 2009-08-18 11:32:26

+0

链接关闭... – Pacerier 2012-02-11 20:20:42

2

是的,您可以使用Throwable.getStackTrace()返回的StackTraceElement类并查找详细信息。

从API:

阵列的最后一个元素(假设该阵列的长度是 非零)代表堆栈,这是第一个方法 调用序列中的底部。

+0

这不是'自己格式化'吗? – ripper234 2009-08-18 09:46:52

+0

是的,这个选项没有解决格式化部分。 – techzen 2009-08-18 10:20:19