правильно printstacktrace из сервлета исключения

голоса
4

поэтому я использую фильтр, чтобы поймать исключение сервлета (потому что мы используем смесь JSF / скольжения сервлетов)

при ловле на ServletException и вызывая printstacktrace большую часть информации теряется.

«истинный» корень исключением, кажется, скрывается за «смешные» выражение

((ServletException) e.getRootCause().getCause()).getRootCause().getCause().getCause().getCause()

это явно не так, как это сделать.

это простой способ напечатать «полную» информацию такого исключения. может кто-нибудь объяснить мне, почему исключение заворачивают таким образом?

Задан 19/05/2009 в 13:13
источник пользователем
На других языках...                            


4 ответов

голоса
1

Это называется исключение цепочки . К оберточному исключению в другом исключении вы можете позволить исключение пузыря стека без ваших основных классов приложения беспокоиться о каких - то исключениях низкого уровня.

Пример:

public void doStuff() throws StuffException {
    try {
        doDatabaseStuff();
    } catch (DatabaseException de1) {
        throw new StuffException("Could not do stuff in the database.", de1);
    }
}

Таким образом , ваше приложение имеет только обрабатывать , StuffExceptionно он может добраться до базового актива , DatabaseExceptionесли это действительно необходимо.

Для того, чтобы добраться до самого нижнего (и всех других) исключения (ы) исключений вы поймали вы можете итератор над его первопричиной:

    ...
} catch (SomeException se1) {
    Throwable t = se1;
    logger.log(Level.WARNING, "Top exception", se1);
    while (t.getCause() != null) {
        t = t.getCause();
        logger.log(Level.WARNING, "Nested exception", t);
    }
    // now t contains the root cause
}
Ответил 19/05/2009 в 13:20
источник пользователем

голоса
6

Посмотрите на ExceptionUtils класса из Викисклада яз. Он содержит несколько полезных методов для печати всей цепочки исключений.

Ответил 19/05/2009 в 13:29
источник пользователем

голоса
3

после того, как я имел взгляд на ExceptionUtils, это решить эту проблему!

    final StringWriter stacktrace = new StringWriter();
    ExceptionUtils.printRootCauseStackTrace(throwable,new PrintWriter(stacktrace));
    msg.append(stacktrace.getBuffer());

это выводит полный StackTrace с каждой частью информации, которая имеет отношение.

Ответил 19/05/2009 в 13:41
источник пользователем

голоса
0

Исключение цепочки для ServletException сложно. В зависимости от среды разработки внедрения веб - сервер и веб в использовании, во время выполнения цепь может использовать причину и / или rootCause. Эта ссылка объясняет это очень хорошо. Для того, чтобы усложнять, я видел исключения , когда причина указывает на само исключение. Вот рекурсивный метод , который мы использовали , который охватывает все основания для ServletExceptions:

public static Throwable getDeepCause(Throwable ex) {
    if (ex == null) {
        return ex;
    }
    Throwable cause;
    if (ex instanceof ServletException) {
        cause = ((ServletException) ex).getRootCause();
        if (cause == null) {
            cause = ex.getCause();
        }
    } else {
        cause = ex.getCause();
    }
    if (cause != null && cause != ex) {
        return getDeepCause(cause);
    } else {
        // stop condition - reached the end of the exception chain
        return ex;
    }
}
Ответил 24/08/2015 в 17:32
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more