2009-08-18 9 views
10

La fonction e.printStackTrace() de Java n'imprime pas tous les détails de la trace de pile de l'exception interne.Obtention d'une trace de pile de chaînes complète, y compris une exception interne

Existe-t-il un moyen facile de générer la trace de pile complète sous forme de chaîne? (En plus de moi-même mise en forme)

Modifier

Je viens de découvrir ce que printStackTrace() fait - apparemment la pile cadres il filtre sont exactement ceux communs à l'exception interne et l'externe. Donc, en fait, c'est plutôt ce que je veux, et non la trace de la pile «complète».

+0

Comment voulez-vous dire - la trace de la pile d'exception interne? Une exception interceptée est-elle propagée dans une autre exception? – Everyone

+0

Quelque chose qui est produit par un catch ... throw new Exception ("foo", e) – ripper234

+0

Je viens de découvrir ce que printStackTrace() fait - apparemment les cadres de la pile qu'il filtre sont exactement ceux communs à l'exception interne et externe un. Donc, en fait, c'est plutôt ce que je veux, et non la trace de la pile «complète». – ripper234

Répondre

8

j'ai fini par rouler ma propre (je pris la mise en œuvre de Throwable.printStackTrace() et pincé un peu):

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

Je suggère que vous utilisiez la classe ExceptionUtils d'Apache Commons lang, qui fournit une méthode utile pour cela.

+0

En fait, getFullStacktrace() n'imprime toujours pas la trace de la pile interne. – ripper234

+0

Malheureusement, il n'y a pas de méthode printFullStacktrace(), mais vous pouvez faire System.err.println (getFullStacktrace()); – romaintaz

+0

Lien est en baisse ... – Pacerier

2

Oui, vous pouvez utiliser la classe StackTraceElement renvoyée par Throwable.getStackTrace() et rechercher les détails.

De l'API:

Le dernier élément de la matrice (en supposant est non nulle la longueur de la matrice) représente le bas de la pile, qui est la première méthode invocation de la séquence.

+0

Comment cela ne se traduit-il pas moi-même? – ripper234

+0

Oui, cette option n'aborde pas la partie de mise en forme. – techzen