¿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.
Respuestas:
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();
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.
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
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();
}
La clase Throwable proporciona dos métodos nombrados printStackTrace
, uno que acepta a PrintWriter
y 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]
puede intentar usar Throwables.writeTo desde la lib spf4j .
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).