2009-08-18 11 views
10

Java e.printStackTrace() no imprime todos los detalles del seguimiento de la pila de la excepción interna.Obtener el seguimiento completo de la pila de cadenas, incluida la excepción interna

¿Hay alguna forma de generar el seguimiento completo de la pila en forma de cadena? (Además de formatear yo mismo)

Editar

acabo de saber lo que hace printStackTrace() - al parecer la pila enmarca filtra son exactamente las comunes a la excepción interna y la externa. De hecho, es más bien lo que quiero, y no el rastro de la pila "completa".

+0

¿Qué quiere decir - seguimiento de la pila de excepción interna? ¿Se propaga una excepción atrapada en otra excepción? – Everyone

+0

Algo que se produce por un catch ... throw new Exception ("foo", e) – ripper234

+0

Acabo de descubrir lo que printStackTrace() hace - al parecer los marcos de pila que filtra son exactamente los comunes a la excepción interna y externa uno. De hecho, es más bien lo que quiero, y no el rastro de la pila "completa". – ripper234

Respuesta

8

acabé rodando mi propia (Tomé la implementación de Throwable.printStackTrace() y ajustado un poco):

public static String joinStackTrace(Throwable e) { 
    StringWriter writer = null; 
    try { 
     writer = new StringWriter(); 
     joinStackTrace(e, writer); 
     return writer.toString(); 
    } 
    finally { 
     if (writer != null) 
      try { 
       writer.close(); 
      } catch (IOException e1) { 
       // ignore 
      } 
    } 
} 

public static void joinStackTrace(Throwable e, StringWriter writer) { 
    PrintWriter printer = null; 
    try { 
     printer = new PrintWriter(writer); 

     while (e != null) { 

      printer.println(e); 
      StackTraceElement[] trace = e.getStackTrace(); 
      for (int i = 0; i < trace.length; i++) 
       printer.println("\tat " + trace[i]); 

      e = e.getCause(); 
      if (e != null) 
       printer.println("Caused by:\r\n"); 
     } 
    } 
    finally { 
     if (printer != null) 
      printer.close(); 
    } 
} 
9

Sugiero que utilice la clase ExceptionUtils de Apache Commons lang, que proporciona un método útil para eso.

+0

En realidad, getFullStacktrace() aún no imprime la traza interior de la pila. – ripper234

+0

Desafortunadamente, no hay un método printFullStacktrace(), pero puede hacer System.err.println (getFullStacktrace()); – romaintaz

+0

El enlace está inactivo ... – Pacerier

2

Sí, puede utilizar la clase StackTraceElement devuelta por Throwable.getStackTrace() y encontrar los detalles.

Desde el API:

El último elemento de la matriz (suponiendo que la longitud de la matriz es no cero) representa la parte inferior de la pila, que es el primer método invocación en la secuencia.

+0

¿Cómo no está 'formateándolo'? – ripper234

+0

sí, esta opción no aborda la parte de formateo. – techzen

Cuestiones relacionadas