web-dev-qa-db-fra.com

Comment afficher la trace de pile sur une exception interceptée?

J'ai une fonction générique qui imprime des exceptions (en utilisant log4j):

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, je vois:

[Ljava.lang.StackTraceElement;@49af7e68

Comment afficher correctement la trace de pile de l'exception?

mettre à jour

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

26
ufk
12
Guillaume

Votre infrastructure de journalisation devrait avoir la capacité de consigner les exceptions, il suffit donc de passer l'exception à l'appel .error(Object, Throwable) approprié devrait suffire:

Si votre infrastructure de journalisation ne peut pas faire cela, 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 PrintWriter enveloppant un StringWriter et appeler .printStackTrace() sur le Exception:

StringWriter sw = new StringWriter();
ex.printStackTrace(new PrintWriter(sw));
String stacktrace = sw.toString();
68
Joachim Sauer

As-tu essayé?

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

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

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

5
coobird

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

Throwables.getStackTraceAsString(Throwable throwable)

4
gpampara

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 me passerais de l'appel à e.getCause () car le stacktrace vous le donnera de toute façon, alors:

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 stacktrace, mais puisque vous utilisez Log4J, vous perdez beaucoup en n'utilisant pas sa gestion des exceptions intégrée.

1
Yishai

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

1
Marco C.