2009-08-18 56 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