Stacktrace completo na página

1 resposta
A

Estou usando Hibernate em uma aplicação Web e sempre que ocorre uma exceção de banco (HibernateException) eu encapsulo em uma Wrapper que criei (WebCommandException, apenas extende Exception) e lanço-a dentro da ServletException, fazendo o Tomcat exibir a página de erro default.
O que acontece é que só aparece a mensagem básica da exceção e não todo o stacktrace na tela. Tem alguma forma de visualizar isso?
Será que o log4j com HTMLAppender faz isso?

1 Resposta

A

Consegui resolver esta questao após umas pesquisas no Google e criando uma classe que "encapsula" a exception, seja ela checked ou unchecked, em uma RuntimeException e fazendo com que o Servlet lance-a para o servidor. Desta forma nao se perde o Stacktrace. Diferente de se fazer: throw new ServletException(exception)

Depois criei uma pagina de erro JSP padrão e o servidor a exibe quando ocorrer uma exceção

Este é o codigo da classe da exception:
public class WebCommandException extends RuntimeException {
    
    Throwable throwable;
    
    private WebCommandException(Throwable t) {
        this.throwable = t;
    }
    
    /** Wraps another exeception in a RuntimeException. */
    public static RuntimeException wrap(Throwable t) {
        if (t instanceof RuntimeException)
            return (RuntimeException) t;
        return new WebCommandException(t);
    }
    
    public Throwable getCause() {
        return this.throwable;
    }
    
    public void printStackTrace() {
        this.throwable.printStackTrace();
    }
}
A página de erro:
<%@ page isErrorPage="true" import="java.io.*"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Erro</title>
    </head>
    <body>
        
        <h1>¡gina de erro</h1>
        <h2>Ocorreu um erro fatal</h2>
        <pre>        
        <%
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        exception.printStackTrace(pw);
        out.print(sw);
        sw.close();
        pw.close();
        %>
        </pre>
        
    </body>
</html>
O metodo que lanca a exception:
try {
    ....
catch (Exception e) {
    throw WebCommandException.wrap(e);
}
Quem tiver ua sugestão de fazer esta página com JSTL, por favor nos mande
Criado 7 de agosto de 2007
Ultima resposta 23 de ago. de 2007
Respostas 1
Participantes 1