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?
log.error (e) <- affiche l'erreur, mais n'affiche pas la trace de la pile
Je vais utiliser le ExceptionUtils # getFullStackTrace of jakarta commons lang
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();
As-tu essayé?
private void _showErrorMessage(Exception e) {
log.error("Hey! got an exception", e);
}
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.
Vous pouvez également consulter les bibliothèques Guava de Google.
Throwables.getStackTraceAsString(Throwable throwable)
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.
Exception Stacktrace logging montre deux méthodes à cet effet, une basée sur Apache Commons et une autre utilisant la méthode JDK standard.