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:
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:
privatestatic 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();
}
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.
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]
getStackTrace
método de Trowable (la excepción) que devolverá una matriz deStackTraceElement
objetos que puede combinar en un String (utilizando el método toString de ese objeto para obtener una línea de un seguimiento).Respuestas:
Throwable.printStackTrace(..)
puede tomar un argumentoPrintWriter
oPrintStream
:} 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 .
fuente
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();
fuente
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.
fuente
Para los minimalistas de desarrolladores de Android:
Log.getStackTraceString(exception)
fuente
Apache commons proporciona una utilidad para convertir el seguimiento de la pila de arrojar a cadena.
Uso:
Para obtener la documentación completa, consulte https://commons.apache.org/proper/commons-lang/javadocs/api-release/index.html
fuente
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(); }
fuente
La clase Throwable proporciona dos métodos nombrados
printStackTrace
, uno que acepta aPrintWriter
y otro que acepta aPrintStream
, que genera el seguimiento de la pila en la secuencia dada. Considere usar uno de estos.fuente
Ver javadoc
out = some stream ... try { } catch ( Exception cause ) { cause . printStrackTrace ( new PrintStream ( out ) ) ; }
fuente
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 .
fuente