2010-02-11 14 views
19

que tienen una función genérica que imprime excepciones (mediante log4j):¿Cómo se muestra el seguimiento de la pila en una excepción detectada?

private void _showErrorMessage(Exception e) { 
    log.error(e.getClass() + ": " + e.getMessage() + ": " + e.getCause() + "\n" + e.getStackTrace().toString()); 
} 

En lugar de ver el seguimiento de pila que estoy viendo:

[Ljava.lang.StackTraceElement;@49af7e68 

¿Cómo puedo ver el seguimiento de pila de la excepción ¿correctamente?

actualización

log.error (e) < - muestra el error, pero no muestra traza de la pila

+8

Llamar 'log.error (e)' en log4j llama a la versión incorrecta del método (http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Category.html#error% 28java.lang.Object% 29). El JavaDoc para este método incluso menciona ese hecho: "ADVERTENCIA Tenga en cuenta que al pasar un Throwable a este método se imprimirá el nombre del Throwable pero no el de la pila. Para imprimir un trazado de pila use el formulario de error (Object, Throwable)". –

+5

call log.error (e, e) hará el trabajo;) – Guillaume

Respuesta

12
+0

exactamente lo que necesitaba, muchas gracias !!!!!!!!!!!!!!! – ufk

+4

Enlace roto !!! Ahh, por favor, solo publique la respuesta en lugar de hacer referencia a otros sitios. – codemonkey

+2

@codemonkey, puede buscar las ExceptionUtils en su motor de búsqueda favorito: mi respuesta fue utilizar una biblioteca existente. No puedo mantener todos los enlaces que he publicado en SO. Ahora, la respuesta de Joachim suena mejor que la mía :) Por favor, léala. – Guillaume

4

Throwable.getStackTrace devuelve una matriz de StackTraceElement s, por lo tanto, el método de toString está volviendo una representación textual de la matriz en sí.

Para obtener realmente la información de seguimiento de la pila, uno debería pasar por cada StackTraceElement para obtener más información.

62

Su marco de registro debe tener la capacidad de registrar excepciones, por lo que simplemente pasando la excepción a la adecuada .error(Object, Throwable) llamada debe ser suficiente:

I Si su marco de trabajo de registro no puede hacer eso, o si necesita el seguimiento de la pila en un String por cualquier otro motivo, entonces se vuelve un poco más difícil. Vas a tener que crear una envoltura de un PrintWriterStringWriter y llame .printStackTrace() en el Exception:

StringWriter sw = new StringWriter(); 
ex.printStackTrace(new PrintWriter(sw)); 
String stacktrace = sw.toString(); 
+0

cuando paso la excepción a log.error, simplemente muestra el mensaje de error sin seguimiento de la pila. usando log4j – ufk

+1

Eso significa que llamó a la versión incorrecta. Hay 'error (Object)' y 'error (Object, Throwable)'. Llamar a la primera versión llamará efectivamente a 'toString()'. –

+2

-1 - log4j puede hacerlo, solo invoca el método incorrecto. –

13

ha intentado?

private void _showErrorMessage(Exception e) { 
    log.error("Hey! got an exception", e); 
} 
+0

+1 para esto! La solución más fácil y limpia! – DerekY

4

También puede consultar las bibliotecas de Guava de Google.

Throwables.getStackTraceAsString(Throwable throwable)

1

La respuesta exacta a su pregunta es que se debe llamar Log4J así:

private void _showErrorMessage(Exception e) { 
    log.error(e.getClass() + ": " + e.getMessage() + ": " + e.getCause(), e); 
} 

Aunque me gustaría prescindir de la llamada a e.getCause() porque el StackTrace que dará de todos modos, así que:

private void _showErrorMessage(Exception e) { 
    log.error(e.getClass() + ": " + e.getMessage(), e); 
} 

ExceptionUtils está bien si realmente necesita una cadena de la StackTrace, pero dado que está utilizando Log4J, que lo se mucho al no utilizar su manejo integrado de excepciones.

Cuestiones relacionadas