¿Cuál es la forma más fácil de convertir el resultado de Throwable.getStackTrace()
a una cadena que representa el stacktrace?
java
stack-trace
tostring
ripper234
fuente
fuente
Respuestas:
Se puede usar el siguiente método para convertir un
Exception
seguimiento de pilaString
. Esta clase está disponible en Apache commons-lang, que es la biblioteca dependiente más común con muchas fuentes abiertas popularesorg.apache.commons.lang.exception.ExceptionUtils.getStackTrace(Throwable)
fuente
org.apache.commons.lang3.exception.ExceptionUtils
.Se usa
Throwable.printStackTrace(PrintWriter pw)
para enviar el seguimiento de la pila a un escritor apropiado.fuente
StringWriter
yPrintWriter
?Esto debería funcionar:
fuente
printStackTrace
debería devolver la cadena, dejando la decisión de si imprimirla o no al usuario :)printXXX()
debería imprimir XXX.Si está desarrollando para Android, una forma mucho más fácil es usar esto:
El formato es el mismo que getStacktrace, por ejemplo
fuente
Log.e("TAG", "My message", new Throwable());
Throwables
Clase de guayabaSi tiene la
Throwable
instancia real , Google Guava proporcionaThrowables.getStackTraceAsString()
.Ejemplo:
fuente
ADVERTENCIA: no incluye la causa (que generalmente es el bit útil)
fuente
String.format("%n")
algo similar en lugar de"\n"
hacer felices a los lamers de DOS.Para mí, la forma más limpia y fácil fue:
fuente
fuente
StringWriter
yPrintWriter
deberían serclose
d ... (o supongo que soloPrintWriter
es necesario cerrarlos, ya que cerrarlos también debería cerrarlosStringWriter
)El siguiente código le permite obtener todo el stackTrace con un
String
formato, sin utilizar API como log4J o inclusojava.util.Logger
:fuente
Aquí hay una versión que se puede copiar y pegar directamente en el código:
O, en un bloque de captura
fuente
Throwable
se define el, ¿verdad?Es la forma más fácil de convertir el resultado en Cadena. Estoy usando esto en mi programa para imprimir el seguimiento de la pila.
fuente
Imprima el seguimiento de la pila en a
PrintStream
, luego conviértalo aString
:fuente
Impresión de seguimiento de pila a cadena
Es útil cuando desea imprimir el seguimiento de la pila de subprocesos actual sin crear una instancia de
Throwable
, pero tenga en cuenta que crear un nuevoThrowable
y obtener el seguimiento de la pila desde allí en realidad es más rápido y más barato que llamarThread.getStackTrace
.fuente
Kotlin
Extender la clase Throwable le dará la propiedad String
error.stackTraceString
:fuente
fuente
Los disparos inteligentes en el primer conjunto de comentarios fueron muy divertidos, pero realmente dependen de lo que intentes hacer. Si aún no tiene la biblioteca correcta, entonces 3 líneas de código (como en la respuesta de D. Wroblewski) son perfectas. OTOH, si ya tiene la biblioteca apache.commons (como lo harán la mayoría de los proyectos grandes), entonces la respuesta de Amar es más corta. De acuerdo, puede llevarle diez minutos obtener la biblioteca e instalarla correctamente (menos de uno si sabe lo que está haciendo). Pero el tiempo corre, por lo que es posible que no tenga tiempo de sobra. Jarek Przygódzki tenía una advertencia interesante: "Si no necesita excepciones anidadas".
Pero ¿y si yo no necesito los seguimientos de pila completos, anidados y todo? En ese caso, el secreto es usar getFullStackTrace de apache.common (consulte http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/exception/ExceptionUtils.html # getFullStackTrace% 28java.lang.Throwable% 29 )
Me salvó el tocino. Gracias, Amar, por la pista!
fuente
Código de Apache Commons Lang 3.4 ( JavaDoc ):
La diferencia con las otras respuestas es que se usa
autoFlush
en elPrintWriter
.fuente
Sin
java.io.*
eso se puede hacer así.Y luego la
trace
variable contiene su rastro de pila. La salida también tiene la causa inicial, la salida es idéntica aprintStackTrace()
Ejemplo,
printStackTrace()
rendimientos:La
trace
cadena se mantiene, cuando se imprime enstdout
fuente
Versión Scala
fuente
si está utilizando Java 8, intente esto
Puede encontrar el código para la
getStackTrace()
función proporcionado porThrowable.java
:y para
StackTraceElement
proveedorestoString()
como:Así que solo únete
StackTraceElement
con "\ n".fuente
una exapansión en la respuesta de Gala que también incluirá las causas de la excepción:
fuente
La solución es convertir el stackTrace de la matriz al tipo de datos de cadena . Vea el siguiente ejemplo:
fuente
Con Java 8 Stream API puedes hacer algo como esto:
Tomará una variedad de elementos traza de la pila, los convertirá en una cadena y se unirá en una cadena multilínea.
fuente
Mi línea para convertir el seguimiento de la pila a la cadena de varias líneas adjunta:
Fácil de pasar al registrador "tal cual".
fuente
printStackTrace()
Aquí perderás: 1) Excepción que se lanzó; 2) Causas y su stacktraceprintStackTrace()
nunca fue parte de la pregunta.Si no desea utilizar una biblioteca externa y no está desarrollando para Android , puede crear un método de 'extensión' como este:
fuente
Antigua pregunta, pero me gustaría agregar el caso especial en el que no desea imprimir toda la pila , eliminando algunas partes que realmente no le interesan, excluyendo ciertas clases o paquetes.
En lugar de
PrintWriter
usar aSelectivePrintWriter
:Donde la
SelectivePrintWriter
clase está dada por:Tenga en cuenta que esta clase se puede adaptar fácilmente para filtrar por Regex
contains
u otros criterios. También tenga en cuenta que depende de losThrowable
detalles de implementación (no es probable que cambie, pero aún así).fuente
Cuando ejecutas el programa, la salida será algo similar:
fuente
Me pregunto por qué nadie mencionó
ExceptionUtils.getStackFrames(exception)
Para mí es la forma más conveniente de volcar stacktrace con todas sus causas hasta el final:
fuente
Advertencia: Esto puede estar un poco fuera de tema, pero bueno ...;)
No sé cuál fue la razón original de los carteles para querer el seguimiento de la pila como cadena en primer lugar. Cuando la traza de la pila debería terminar en un REGISTRO SLF4J / Logback, pero no se produjo ni se debe hacer una excepción, esto es lo que hago:
Me gusta porque no requiere una biblioteca externa (que no sea su backend de registro, que de todos modos estará en su lugar la mayor parte del tiempo, por supuesto).
fuente
Pocas opciones
StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); String exceptionAsString = sw.toString();
Usando Google Guava lib
String stackTrace = Throwables.getStackTraceAsString ( myException ) ;
org.apache.commons.lang.exception.ExceptionUtils.getStackTrace (Throwable)
fuente