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.


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 .


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();

3
Esto es lo que necesitaba (¡aunque me siento muy sucio usándolo!)
Henley Chiu

77

Existe una forma alternativa de Throwable.printStackTrace () que toma un flujo de impresión como argumento. http://download.oracle.com/javase/6/docs/api/java/lang/Throwable.html#printStackTrace(java.io.PrintStream)

P.ej

catch(Exception e) {
    e.printStackTrace(System.out);
}

Esto imprimirá el seguimiento de la pila en std out en lugar del error std.


4
@FranklinYu, el objetivo de la pregunta es que no quiere imprimir en stderr, sino en otro flujo arbitrario.
Mike Deck

9

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


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


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();
}

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.


1

Ver javadoc

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

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 .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.