2010-02-11 6 views
19

J'ai une fonction générique qui imprime des exceptions (en utilisant log4j):Comment afficher la trace de pile sur une exception interceptée?

private void _showErrorMessage(Exception e) { 
    log.error(e.getClass() + ": " + e.getMessage() + ": " + e.getCause() + "\n" + e.getStackTrace().toString()); 
} 

Au lieu de voir la trace de la pile que je vois:

[Ljava.lang.StackTraceElement;@49af7e68 

Comment puis-je voir la trace de la pile de l'exception correctement?

mise à jour

log.error (e) < - montre l'erreur, mais ne montre pas trace de la pile

+8

L'appel de 'log.error (e)' dans log4j appelle la mauvaise version de la méthode (http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Category.html#error% 28java.lang.Object% 29). Le JavaDoc pour cette méthode mentionne même ce fait: "AVERTISSEMENT Notez que passer un Throwable à cette méthode affichera le nom de Throwable mais pas de trace de pile Pour imprimer une trace de pile, utilisez plutôt le formulaire error (Object, Throwable)." –

+5

appel log.error (e, e) fera le travail;) – Guillaume

Répondre

12
+0

exactement ce dont j'avais besoin, merci beaucoup !!!!!!!!!!!!!!! – ufk

+4

Lien brisé !!! ahhh s'il vous plaît juste poster la réponse au lieu de faire référence à d'autres sites. – codemonkey

+2

@codemonkey, vous pouvez rechercher vous-même les ExceptionUtils dans votre moteur de recherche préféré: ma réponse était d'utiliser une bibliothèque existante. Je ne peux pas maintenir tous les liens que j'ai publiés dans SO. Maintenant, la réponse de Joachim sonne mieux que la mienne :) S'il vous plaît lisez-le. – Guillaume

4

Throwable.getStackTrace retourne un tableau de StackTraceElement s, d'où la méthode toString renvoie une représentation textuelle le tableau lui-même.

Afin de récupérer réellement les informations de trace de la pile, il faudrait parcourir StackTraceElement pour obtenir plus d'informations.

62

Votre cadre de l'exploitation forestière devrait avoir la possibilité de se connecter exceptions, si simplement passer l'exception à l'appel .error(Object, Throwable) approprié devrait être suffisant:

I Si votre infrastructure de consignation ne peut pas le faire, ou si vous avez besoin de la trace de pile dans un String pour toute autre raison, cela devient un peu plus difficile. Vous devrez créer un emballage PrintWriter un StringWriter et appelez .printStackTrace() sur le Exception:

StringWriter sw = new StringWriter(); 
ex.printStackTrace(new PrintWriter(sw)); 
String stacktrace = sw.toString(); 
+0

lorsque je passe l'exception à log.error, il montre juste le message d'erreur sans trace de la pile. using log4j – ufk

+1

Cela signifie que vous avez appelé la mauvaise version. Il y a 'error (Object)' et 'error (Object, Throwable)'. L'appel de la première version appellera effectivement 'toString()'. –

+2

-1 - log4j peut le faire, il invoque simplement la mauvaise méthode. –

13

Avez-vous essayé?

private void _showErrorMessage(Exception e) { 
    log.error("Hey! got an exception", e); 
} 
+0

+1 pour cette solution la plus simple et la plus propre! – DerekY

4

Vous pouvez également consulter les bibliothèques Guava de Google.

Throwables.getStackTraceAsString(Throwable throwable)

1

La réponse exacte à votre question est que vous devez appeler Log4J comme ceci:

private void _showErrorMessage(Exception e) { 
    log.error(e.getClass() + ": " + e.getMessage() + ": " + e.getCause(), e); 
} 

Bien que je ne maintiendrais l'appel à e.getCause() parce que le stacktrace donnera que pour vous de toute façon, donc:

private void _showErrorMessage(Exception e) { 
    log.error(e.getClass() + ": " + e.getMessage(), e); 
} 

ExceptionUtils est très bien si vous avez vraiment besoin d'une chaîne de la stacktrace, mais puisque vous utilisez Log4J, vous lo se beaucoup en n'utilisant pas sa gestion intégrée des exceptions.

1

Exception Stacktrace logging montre deux méthodes à cet effet, l'une basée sur Apache Commons et l'autre utilisant la méthode JDK standard.

Questions connexes