2008-09-10 6 views

Respuesta

8
+0

El inconveniente es que dumpStack() solo va a stderr, y no se puede enviar a otro lugar como se puede con una excepción o Thread.getStackTrace(). –

+4

Utilice el registro. La impresión de stdout/stderr solo debe realizarla las utilidades del sistema operativo y las aplicaciones "Hello World". –

2

Debería atrapar la excepción en un bloque try-catch.

e.getStackTrace(); 

Devuelve StackTraceElement [] que luego puede interpretar.

también:

e.printStackTrace() 

se ... imprimir el StackTrace.

4

Sólo la creación de una excepción arbitraria hace el truco para mí:

System.out.println("Oops, the bad thing happened"); 
new IllegalStateException().printStackTrace(); 
+0

Deberías jus t use Thread.getStackTrace(). – jjnguy

+0

Creo que este método causará una advertencia en algunos IDEs, como IntelliJ, porque está creando una excepción pero no la está lanzando. Recomiendo el método Thread.getStackTrace() que tiene la misma lógica pero está oculto para el desarrollador. –

+0

Thread.dumpStack() es más fácil si solo desea enviarlo a stderr (ahorra tener que recorrer los elementos de traza de la pila). –

3

Así como lo @jjnguy Dicho esto, si usted no tiene una excepción, también se puede marcar Thread.getStackTrace().

4

Si desea guardar el seguimiento de la pila en una cadena que puede hacer esto;

String exception = ""; 
for (StackTraceElement element : e.getStackTrace()) 
    exception += element.toString() + "\n"; 

Donde e es, obviamente, una excepción.

Además, suena muy extraño generar automáticamente una excepción propia solo para encontrar obtener un seguimiento de pila para una depuración. Obtenga Eclipse y use su modo de depuración, es realmente increíble.

+0

¿No debería uno hacer step o recurse a través de e.getCause() y obtener rastros de pila para todos ellos también? – slim

+0

No creo que haya una causa cuando lo haces así. – Chris

+0

Utilice 'StringBuilder' en lugar de' String' para múltiples concatenaciones. – minipif

16

Si utiliza log4j

Exception e = new Exception(); 
log.error("error here", e); 

imprimirá la StackTrace a su registro.

+0

+1 por no usar stdout/stderr –

1

El hecho de que lo necesitaba a mí mismo:.

Como se inspira en respuesta How do I find the caller of a method using stacktrace or reflection?, se puede recuperar la pila de llamadas usando

StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace() 

A continuación, procesar e imprimir/log lo que está interesado en trabajar más que usar Thread.dumpStack(), pero más flexible.

1

Para imprimir simplemente el seguimiento de la pila actual en stderr, puede llamar a:

Thread.dumpStack(); 

que a su vez sólo llama:

new Exception("Stack trace").printStackTrace(); 

Para dar salida a stdout en lugar de stderr, pasar System.out a printStackTrace():

new Exception("Stack trace").printStackTrace(System.out); 
Cuestiones relacionadas