Подтвердить что ты не робот

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

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

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

Edit

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

4b9b3361

Ответ 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) представляет собой нижнюю часть стека, которая является первым методом вызов в последовательности.