Imprimir el seguimiento de la pila de una excepción

3 minutos de lectura

avatar de usuario
autocaravana

¿Cómo imprimo el seguimiento de la pila de una excepción a 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 getStackTrace método de Trowable (la excepción) que devolverá una matriz de StackTraceElement objetos que puede combinar en una cadena (usando el método toString de ese objeto para obtener una línea de seguimiento).

    – jcubic

    4 de diciembre de 2013 a las 7:34

No es hermoso, pero una solución, no obstante:

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

String stackTrace = writer.toString();

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

    – henley

    16/09/2013 a las 19:45

avatar de usuario
mike cubierta

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 a la salida estándar en lugar del error estándar.

  • @FranklinYu, el punto central de la pregunta es que no quiere imprimir en stderr, sino en otra secuencia arbitraria.

    – Mike Deck

    16 de febrero de 2016 a las 16:34

  • en vez de System.out puedes usar e.printStackTrace(new PrintStream("path.txt"))

    – Mauricio Gracia Gutiérrez

    30 de junio a las 5:48

avatar de usuario
Bozho

Throwable.printStackTrace(..) puede tomar un PrintWriter o PrintStream argumento:

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

Dicho esto, considere usar una interfaz de registrador como SLF4J con una implementación de registro como Volver a iniciar sesión o log4j.

  • ¿Cómo imprimiríamos esto con log4j? log.error(ej.printStackTrace())?

    –Geoff Langenderfer

    17 de junio a las 0:06

avatar de usuario
patricioma

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

Apache commons proporciona una utilidad para convertir el seguimiento de la pila de arrojable 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 otra secuencia.

    – Buurman

    20 de marzo de 2018 a las 16:10

  • 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, utilizando un formato muy bien establecido. ¡Gracias!

    – Clint Eastwood

    20 de febrero de 2019 a las 13:57

avatar de usuario
ffonz

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

  • 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 otra secuencia.

    – Buurman

    20 de marzo de 2018 a las 16:10

  • 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, utilizando un formato muy bien establecido. ¡Gracias!

    – Clint Eastwood

    20 de febrero de 2019 a las 13:57

avatar de usuario
templatetypedef

los arrojable clase proporciona dos métodos llamados printStackTraceuno que acepta un PrintWriter y uno que toma en un PrintStream, que genera el seguimiento de la pila en la secuencia dada. Considere usar uno de estos.

¿Ha sido útil esta solución?