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

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

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

Edit

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

Ответ 1

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

Ответ 2

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

Ответ 3

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

Из API:

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