2011-07-25 178 views
55

如何將異常的堆棧跟蹤打印到stderr以外的流中?我發現的一種方法是使用getStackTrace()並將整個列表打印到流中。打印異常的堆棧跟蹤

+0

如果你想獲得異常跟蹤,如字符串可以調用'Trowable(異常),將返回StackTraceElement'對象的數組',你可以結合到一個字符串的方法getStackTrace'(使用的toString方法該對象獲取一條跟蹤線)。 – jcubic

回答

46

Throwable.printStackTrace(..)可以採取PrintWriterPrintStream說法:

} catch (Exception ex) { 
    ex.printStackTrace(new PrintStream(yourOutputStream)); 
} 

這就是說,可以考慮使用記錄器界面像SLF4J與日誌實現像LOGBacklog4j

2

Throwable類提供兩種方法命名printStackTrace,一個接受一個PrintWriter,而另一種在一個PrintStream,輸出堆棧跟蹤給定流。考慮使用其中之一。

61

不漂亮,但仍然一個解決方案:

StringWriter writer = new StringWriter(); 
PrintWriter printWriter = new PrintWriter(writer); 
exception.printStackTrace(printWriter); 
printWriter.flush(); 

String stackTrace = writer.toString(); 
+3

這就是我所需要的(儘管我覺得它真的很髒!) –

1

javadoc

out = some stream ... 
try 
{ 
} 
catch (Exception cause) 
{ 
     cause . printStrackTrace (new PrintStream (out)) ; 
} 
8

對於Android開發極簡主義:Log.getStackTraceString(exception)

+1

你不能用它來打印任意流。只有配置了記錄器纔有用。 –

+0

這對於Android開發非常有用。謝謝! – wyzkid207

+0

我喜歡這個極簡主義的方法,但它沒有與我的slf4j :( – killjoy

2

我有一個與得到的堆棧跟蹤

幫助的方法
private static String getStackTrace(Exception ex) { 
    StringBuffer sb = new StringBuffer(500); 
    StackTraceElement[] st = ex.getStackTrace(); 
    sb.append(ex.getClass().getName() + ": " + ex.getMessage() + "\n"); 
    for (int i = 0; i < st.length; i++) { 
     sb.append("\t at " + st[i].toString() + "\n"); 
    } 
    return sb.toString(); 

}