Получение полной трассировки стека строк, включая внутреннее исключение

Java e.printStackTrace() не печатает все детали внутренней трассировки стека исключений.

Есть ли готовый способ создания полной трассировки стека в форме строки? (кроме того, что он сам форматирует)

Edit

Я только что узнал, что делает printStackTrace() - видимо, фильтры стека, которые он фильтрует, точно соответствуют общим внутренним исключениям и внешним. Так что на самом деле это скорее то, что я хочу, а не "полная" трассировка стека.

3 ответа

Я закончил свой собственный (я взял реализацию 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();
 }
}


Я предлагаю вам использовать класс ExceptionUtils из Apache Commons lang, который предоставляет полезный метод для этого.


Да, вы можете использовать класс StackTraceElement, возвращаемый Throwable.getStackTrace(), и найти детали.

Из API:

Последний элемент массива (при условии, что длина массива равна non-zero) представляет собой нижнюю часть стека, которая является первым методом вызов в последовательности.

licensed under cc by-sa 3.0 with attribution.