今天要記錄下一個功能,就是將異常信息努释,通過郵件發(fā)送給我拷泽。過程中遇到一個問題疫鹊,怎樣獲取到異常堆棧信息并將它輸出為字符串,來通過郵件的形式發(fā)送出來司致。
其中最為主要的就是獲取異常堆棧拆吆,并將之輸出為字符串;
下面是一個實(shí)例:
@org.junit.Test
public void testNull() {
try {
testNullException();
} catch (Exception e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
System.out.println("e.getCause() : " + e.getCause());
System.out.println("e.getSuppressed() : " + e.getSuppressed());
System.out.println("e.getStackTrace() : " + e.getStackTrace());
System.out.println("e.getLocalizedMessage() : " + e.getLocalizedMessage());
System.out.println("e.getMessage() : " + e.getMessage());
System.out.println("e.getClass() : " + e.getClass());
/**
* e.getCause() : null
e.getSuppressed() : [Ljava.lang.Throwable;@5b464ce8
e.getStackTrace() : [Ljava.lang.StackTraceElement;@57829d67
e.getLocalizedMessage() : null
e.getMessage() : null
e.getClass() : class java.lang.NullPointerException
*/
System.out.println("==================");
e.printStackTrace(pw);
System.out.println("e " + sw.toString());
}
}
private void testNullException() {
List<String> list = null;
System.out.println(list.get(0).toString());
}
其中的主要原理就是通過throwable
的printStackTrace(pw)
將輸出輸出到流中蚌吸,然后通過字符流將其中的數(shù)據(jù)轉(zhuǎn)換成字符。所以我們可以進(jìn)行一些封裝:
public static String getStackTrace(Throwable throwable) {
StringWriter sw = new StringWriter();
PrintWriter printWriter = new PrintWriter(sw);
try {
throwable.printStackTrace(printWriter);
return sw.toString();
} finally {
printWriter.close();
}
}
可能你會想說砌庄,為啥StringWriter
沒有在finally
關(guān)閉羹唠,其實(shí)不是不關(guān)閉,而是sw.close()
它就是一個空實(shí)現(xiàn)娄昆,調(diào)用它的close
方法佩微,其實(shí)也沒做操作。
有問題歡迎留言交流萌焰,或者聯(lián)系哺眯。
原文地址:異常堆棧輸出為字符串