Imprimir el seguimiento de la pila de una excepción

81

¿Cómo imprimo el seguimiento de la pila de una excepción en una secuencia que no sea stderr? Una forma que encontré es usar getStackTrace () e imprimir la lista completa en la secuencia.

rv
fuente
Si desea obtener un seguimiento de excepción como String, puede llamar al getStackTracemétodo de Trowable (la excepción) que devolverá una matriz de StackTraceElementobjetos que puede combinar en un String (utilizando el método toString de ese objeto para obtener una línea de un seguimiento).
jcubic

Respuestas:

61

Throwable.printStackTrace(..)puede tomar un argumento PrintWritero PrintStream:

} catch (Exception ex) {
    ex.printStackTrace(new java.io.PrintStream(yourOutputStream));
}

Dicho esto, considere usar una interfaz de registro como SLF4J con una implementación de registro como LOGBack o log4j .

Bozho
fuente
77

No es hermoso, pero es una solución:

StringWriter writer = new StringWriter();
PrintWriter printWriter = new PrintWriter( writer );
exception.printStackTrace( printWriter );
printWriter.flush();

String stackTrace = writer.toString();
Maurício Linhares
fuente
3
Esto es lo que necesitaba (¡aunque me siento muy sucio usándolo!)
Henley Chiu
9

Para los minimalistas de desarrolladores de Android: Log.getStackTraceString(exception)

PatrickMA
fuente
1
No puede usar esto para imprimir en una secuencia arbitraria. Es útil solo si tiene un registrador configurado.
rv
Me gustó este enfoque minimalista, pero no encajaba con mi slf4j :(
killjoy
7

Apache commons proporciona una utilidad para convertir el seguimiento de la pila de arrojar a cadena.

Uso:

ExceptionUtils.getStackTrace(e)

Para obtener la documentación completa, consulte https://commons.apache.org/proper/commons-lang/javadocs/api-release/index.html

Rathan
fuente
Si bien esta respuesta parece muy correcta, no es una respuesta a la pregunta. OP preguntó cómo podía imprimir el seguimiento de la pila en otro flujo.
Buurman
Aunque esto podría no responder a la pregunta de OP, creo que esta es la mejor manera de tener una excepción como String, usando un formato muy bien establecido. ¡Gracias!
Clint Eastwood
7

He creado un método que ayuda a obtener stackTrace:

private static String getStackTrace(Exception ex) {
    StringBuffer sb = new StringBuffer(500);
    StackTraceElement[] st = ex.getStackTrace();
    sb.append(ex.getClass().getName() + ": " + ex.getMessage() + "\n");
    for (int i = 0; i < st.length; i++) {
      sb.append("\t at " + st[i].toString() + "\n");
    }
    return sb.toString();
}
kuppurangi
fuente
3

La clase Throwable proporciona dos métodos nombrados printStackTrace, uno que acepta a PrintWritery otro que acepta a PrintStream, que genera el seguimiento de la pila en la secuencia dada. Considere usar uno de estos.

templatetypedef
fuente
1

Ver javadoc

out = some stream ...
try
{
}
catch ( Exception cause )
{
      cause . printStrackTrace ( new PrintStream ( out ) ) ;
}
emory
fuente
0

Si está interesado en un seguimiento de pila más compacto con más información (detalle del paquete) que se parece a:

  java.net.SocketTimeoutException:Receive timed out
    at j.n.PlainDatagramSocketImpl.receive0(Native Method)[na:1.8.0_151]
    at j.n.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:143)[^]
    at j.n.DatagramSocket.receive(DatagramSocket.java:812)[^]
    at o.s.n.SntpClient.requestTime(SntpClient.java:213)[classes/]
    at o.s.n.SntpClient$1.call(^:145)[^]
    at ^.call(^:134)[^]
    at o.s.f.SyncRetryExecutor.call(SyncRetryExecutor.java:124)[^]
    at o.s.f.RetryPolicy.call(RetryPolicy.java:105)[^]
    at o.s.f.SyncRetryExecutor.call(SyncRetryExecutor.java:59)[^]
    at o.s.n.SntpClient.requestTimeHA(SntpClient.java:134)[^]
    at ^.requestTimeHA(^:122)[^]
    at o.s.n.SntpClientTest.test2h(SntpClientTest.java:89)[test-classes/]
    at s.r.NativeMethodAccessorImpl.invoke0(Native Method)[na:1.8.0_151]

puede intentar usar Throwables.writeTo desde la lib spf4j .

usuario2179737
fuente