2011-07-25 38 views
55

¿Cómo imprimo el seguimiento de la pila de una excepción a una secuencia distinta de stderr? Una manera que encontré es usar getStackTrace() e imprimir toda la lista en la transmisión.Imprimir el seguimiento de la pila de una excepción

+0

Si desea obtener traza excepción como cadena puede llamar 'método de getStackTrace' Trowable (la excepción) que devolverá variedad de objetos' StackTraceElement' que se pueden combinar con una cadena (usando el método toString de ese objeto para obtener una línea de un rastro). – jcubic

Respuesta

46

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

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

Dicho esto, considerar el uso de una interfaz de registrador como SLF4J con una aplicación de registro como LOGBack o log4j.

2

La clase Throwable proporciona dos métodos denominados printStackTrace, uno que acepta un uno PrintWriter y que lleva en un PrintStream, que da salida a la traza de la pila a la corriente dada. Considera usar uno de estos.

56

Hay una forma alternativa de Throwable.printStackTrace() que toma una secuencia de impresión como argumento. http://download.oracle.com/javase/6/docs/api/java/lang/Throwable.html#printStackTrace(java.io.PrintStream)

E.g.

catch(Exception e) { 
    e.printStackTrace(System.out); 
} 

Esto imprimirá el trazado de la pila como estándar en lugar del error estándar.

+3

@FranklinYu, el objetivo de la pregunta es que no desea imprimir en stderr, sino en otra secuencia arbitraria. –

61

No es hermosa, sino una solución, no obstante:

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

String stackTrace = writer.toString(); 
+3

Esto es lo que necesitaba (¡aunque me siento realmente sucio al usarlo!) –

1

Ver javadoc

out = some stream ... 
try 
{ 
} 
catch (Exception cause) 
{ 
     cause . printStrackTrace (new PrintStream (out)) ; 
} 
8

Para los minimalistas dev android: Log.getStackTraceString(exception)

+1

No puede usar esto para imprimir en una secuencia arbitraria. Solo es útil si tiene un registrador configurado. –

+0

Esto funciona muy bien para el desarrollo de Android. ¡Gracias! – wyzkid207

+0

Me gustó este enfoque minimalista pero no se combinó con mi slf4j :( – killjoy

2

Tengo un método que ayuda a conseguir la 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(); 

}

Cuestiones relacionadas