corretamente printStackTrace de exceção servlet

votos
4

assim que eu estou usando um filtro para capturar exceção servlet (porque estamos usando uma mistura de jsf / servlets simples)

quando pegar o ServletException e chamando printStackTrace a maior parte da informação é perdida.

a verdadeira exceção raiz parece ser escondida por trás da expressão engraçado

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

este não é claramente o caminho para fazê-lo.

é a uma maneira fácil de imprimir as informações cheio de tal reserva. alguém pode me explicar por que a exceção é enrolado desta maneira?

Publicado 19/05/2009 em 15:13
fonte usuário
Em outras línguas...                            


4 respostas

votos
6

Dê uma olhada no ExceptionUtils classe de commons-lang. Ele contém vários métodos úteis para a impressão de toda a cadeia de excepções.

Respondeu 19/05/2009 em 15:29
fonte usuário

votos
3

depois que eu tinha um olhar para ExceptionUtils, este resolveu o problema!

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

este imprime o stacktrace completa com cada pedaço de informação que é relevante.

Respondeu 19/05/2009 em 15:41
fonte usuário

votos
1

Isso é chamado de encadeamento de exceção . Envolvendo uma exceção em uma exceção diferente você pode deixar exceções bolha até a pilha sem ter seus principais classes de aplicação que se preocupar com algumas exceções de baixo nível.

Exemplo:

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

Desta forma, a sua aplicação só tem de lidar StuffException, mas pode chegar ao subjacente DatabaseExceptionse ele realmente precisa.

Para chegar ao fundo-mais (e todos os outros) exceção (s) de uma exceção que você pegou você pode iterador sobre as suas causas profundas:

    ...
} 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
}
Respondeu 19/05/2009 em 15:20
fonte usuário

votos
0

Encadeamento de exceção para ServletException é complicado. Dependendo da estrutura de desenvolvimento de implementação do servidor web e web em uso, em tempo de execução a corrente pode usar causa e / ou rootcause. Esta ligação explica isso muito bem. Para complicar as coisas, eu vi exceções onde a causa aponta para a própria exceção. Aqui está um método recursivo temos usado, que abrange todas as bases para 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;
    }
}
Respondeu 24/08/2015 em 18:32
fonte usuário

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