Quelle est la façon la plus simple de convertir le résultat de Throwable.getStackTrace()
en une chaîne qui représente le stacktrace?
java
stack-trace
tostring
ripper234
la source
la source
Réponses:
On peut utiliser la méthode suivante pour convertir une
Exception
trace de pile enString
. Cette classe est disponible dans Apache commons-lang qui est la bibliothèque dépendante la plus courante avec de nombreuses sources ouvertes populairesorg.apache.commons.lang.exception.ExceptionUtils.getStackTrace(Throwable)
la source
org.apache.commons.lang3.exception.ExceptionUtils
.Utilisez
Throwable.printStackTrace(PrintWriter pw)
pour envoyer la trace de pile à un écrivain approprié.la source
StringWriter
etPrintWriter
?Cela devrait fonctionner:
la source
printStackTrace
devrait simplement renvoyer une chaîne, laissant la décision de l'imprimer ou non à l'utilisateur :)printXXX()
devrait afficher XXX.Si vous développez pour Android, un moyen beaucoup plus simple consiste à utiliser ceci:
Le format est le même que getStacktrace, par exemple
la source
Log.e("TAG", "My message", new Throwable());
Throwables
Classe de goyaveSi vous avez l'
Throwable
instance réelle , Google Guava fournitThrowables.getStackTraceAsString()
.Exemple:
la source
AVERTISSEMENT: n'inclut pas la cause (qui est généralement le bit utile!)
la source
String.format("%n")
ou quelque chose de similaire au lieu de"\n"
faire plaisir aux lamers DOS.Pour moi, le moyen le plus propre et le plus simple était:
la source
la source
StringWriter
etPrintWriter
doivent êtreclose
d ... (ou je suppose que seuls lesPrintWriter
besoins doivent être fermés car la fermeture devrait fermer leStringWriter
trop)Le code suivant vous permet d'obtenir l'intégralité de stackTrace avec un
String
format, sans utiliser d'API comme log4J ou mêmejava.util.Logger
:la source
Voici une version qui peut être copiée directement dans le code:
Ou, dans un bloc de capture
la source
Throwable
est défini, non?Est le moyen le plus simple de convertir le résultat en chaîne Je l'utilise dans mon programme pour imprimer la trace de la pile
la source
Imprimez la trace de pile dans a
PrintStream
, puis convertissez-la en aString
:la source
Impression de la trace de pile dans une chaîne
Il est utile lorsque vous souhaitez imprimer la trace de la pile de threads actuelle sans créer d'instance de
Throwable
- mais notez que la création d'une nouvelleThrowable
trace de pile à partir de là est en fait plus rapide et moins coûteuse que d'appelerThread.getStackTrace
.la source
Kotlin
L'extension de la classe Throwable vous donnera la propriété String
error.stackTraceString
:la source
la source
Le tir intelligent dans la première série de commentaires a été très amusant, mais cela dépend vraiment de ce que vous essayez de faire. Si vous n'avez pas déjà la bonne bibliothèque, alors 3 lignes de code (comme dans la réponse de D. Wroblewski) sont parfaites. OTOH, si vous avez déjà la bibliothèque apache.commons (comme la plupart des grands projets), alors la réponse d'Amar est plus courte. OK, cela peut vous prendre dix minutes pour obtenir la bibliothèque et l'installer correctement (moins d'une si vous savez ce que vous faites). Mais l'horloge tourne, vous n'aurez donc peut-être pas de temps à perdre. Jarek Przygódzki avait une mise en garde intéressante - "Si vous n'avez pas besoin d'exceptions imbriquées".
Mais si je ne dois les traces de la pile complète, et tous imbriqués? Dans ce cas, le secret consiste à utiliser getFullStackTrace d'apache.common (voir http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/exception/ExceptionUtils.html # getFullStackTrace% 28java.lang.Throwable% 29 )
Cela a sauvé mon bacon. Merci, Amar, pour l'astuce!
la source
Code d' Apache Commons Lang 3.4 ( JavaDoc ):
La différence avec les autres réponses est qu'il utilise
autoFlush
sur lePrintWriter
.la source
Sans
java.io.*
cela, cela peut se faire comme ça.Et puis le
trace
variable contient votre trace de pile. La sortie contient également la cause initiale, la sortie est identique àprintStackTrace()
Exemple,
printStackTrace()
donne:La
trace
chaîne tient, lorsqu'elle est imprimée surstdout
la source
Version Scala
la source
si vous utilisez Java 8, essayez ceci
vous pouvez trouver le code de
getStackTrace()
fonction fourni parThrowable.java
:et pour
StackTraceElement
, il fournittoString()
comme:Il suffit donc de rejoindre le
StackTraceElement
"\ n".la source
une extension de la réponse de Gala qui inclura également les causes de l'exception:
la source
La solution consiste à convertir le stackTrace du tableau en type de données chaîne . Voir l'exemple suivant:
la source
Avec l' API Java 8 Stream, vous pouvez faire quelque chose comme ceci:
Il prendra un tableau d'oligo-éléments de pile, les convertira en chaîne et les joindra en chaîne multiligne.
la source
Mon oneliner pour convertir la trace de la pile en la chaîne multiligne incluse:
Facile à transmettre à l'enregistreur "tel quel".
la source
printStackTrace()
Ici, vous perdrez: 1) Exception qui a été levée; 2) Les causes et leur stacktraceprintStackTrace()
jamais fait partie de la question.Si vous ne souhaitez pas utiliser une bibliothèque externe et que vous ne développez pas pour Android , vous pouvez créer une méthode d'extension comme celle-ci:
la source
Vieille question, mais je voudrais juste ajouter le cas spécial où vous ne voulez pas imprimer toute la pile , en supprimant certaines parties qui ne vous intéressent pas réellement, à l'exclusion de certaines classes ou packages.
Au lieu d'une
PrintWriter
utilisationSelectivePrintWriter
:Lorsque la
SelectivePrintWriter
classe est donnée par:Veuillez noter que cette classe peut être facilement adaptée pour filtrer par Regex
contains
ou d'autres critères. Notez également que cela dépend desThrowable
détails de mise en œuvre (peu susceptibles de changer, mais quand même).la source
Lorsque vous exécutez le programme, la sortie sera quelque chose de similaire:
la source
Je me demande pourquoi personne n'a mentionné
ExceptionUtils.getStackFrames(exception)
Pour moi, c'est le moyen le plus pratique de vider stacktrace avec toutes ses causes jusqu'à la fin:
la source
Attention: c'est peut-être un peu hors sujet, mais bon ...;)
Je ne sais pas quelle était la raison originale des affiches pour vouloir la trace de la pile comme chaîne en premier lieu. Lorsque la trace de pile doit se retrouver dans un journal SLF4J / Logback, mais qu'aucune exception n'a été ou ne devrait être levée, voici ce que je fais:
Je l'aime parce qu'il ne nécessite pas de bibliothèque externe (autre que votre backend de journalisation, qui sera bien sûr en place la plupart du temps).
la source
Peu d'options
StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); String exceptionAsString = sw.toString();
Utilisation de Google Guava lib
String stackTrace = Throwables.getStackTraceAsString ( myException ) ;
org.apache.commons.lang.exception.ExceptionUtils.getStackTrace (Throwable)
la source