Comment puis-je convertir une trace de la pile d'une chaîne de caractères?
Quelle est la manière la plus facile de convertir le résultat de Throwable.getStackTrace()
à une chaîne de caractères qui représente la stacktrace?
- Parce que jqno réponse utilise en fait le Lancer.méthode getStackTrace() que vous avez indiqué dans votre question, alors que Brian ne l'est pas. Il utilise Throwable.printStackTrace() à la place.
- Juste au sujet de chaque projet Java devrait inclure Apache commons-lang. Il comprend de nombreuses méthodes pratiques de mise en œuvre extrêmement commun des besoins de développement.
- Ces trois lignes de code presque certainement besoin d'affacturage de l'endroit que vous avez appelés. Car vous ne savez pas où les mettre, ils vont aller dans votre utilitaire boîte à outils avec tous les autres extraits. Bingo! vous venez de réinventer la goyave / commons-lang / whatever... seulement pas si bien. Importer un sensible utilitaires de la bibliothèque de la place, et de les enregistrer, de réinventer la roue. Le véritable signe de la novice est de penser que vous pouvez faire un meilleur travail que la bibliothèque des écrivains.
- NB Seul Niveau d'Abstraction Principe est la raison pour laquelle ce genre de chose devrait être pris en compte. Facilite la lisibilité et la testabilité, découvre des éléments réutilisables. Voir: slideshare.net/guestebde/10-ways-to-improve-your-code-neal-ford
- 1. La goyave a - Throwables.getStackTraceAsString(e) 2. Apache Commons - Lang ExceptionUtils.getFullStackTrace 3. Écrire nos propres méthodes personnalisées
- Je ne comprends pas pourquoi les gars, vous essayez donc dur de bash StijndeWitt de vouloir y parvenir avec une petit extrait. Il n'y a vraiment pas beaucoup de danger dans l'écriture d'un petit utilitaire de méthode (je ne le vois pas comme un "PURE ARROGANCE oh nooooo!! il pense qu'il est mieux que Apache!!"). Il y a des tonnes de projets, notamment dans les non-Java JVM langues qui ne veulent vraiment pas inclure de Goyave ou des Communes Lang juste pour se connecter à une stacktrace. J'écris Scala & Clojure bibliothèques et ne sera certainement pas faire de Apache Commons Lang une dépendance transitive juste pour une méthode.
- Pas de dénigrement, à peine capable de désaccord. C'était un peu trop faux, j'ai été gâter pour un combat après avoir vu quelques mauvaises homebrewed utilitaires. Je suis d'accord il y a des raisons de ne pas ajouter une dépendance, je viens plus souvent l'inverse erreur.
- Nous sommes donc beaucoup plus évolué et avancé maintenant dans notre connaissance et notre compréhension du code. Pas besoin de la petite questions plus. Laissez le commonfolk en pourriture dans leurs carences.
- Je suis venu ici parce que lors de l'écriture d'Amazon Lambda fonctions en Java, vous voudrez peut-être éviter l'importation de bibliothèques, puisqu'ils font le conteneur de temps de démarrage de la sucer. Alors parfois, il est encore nécessaire de réinventer la roue. Ou peut-être que je pourrais résoudre ce avec ProGuard...
- je ne sais pas si j'interprète votre sarcasme? correctement, mais je pense que vous n'avez pas interpréter moi correctement: je voulais dire, qui a DONC un Problème. En effet, il a tourné élitiste. Il échoue complètement à ouvrir une connexion pour les débutants à l'entrée. E. g. ils ne veulent pas d'un non-anglais DONC. Ce qui est contraire à la démocratie et élitiste. Il y a ppl qui peut programme/voulez mais ne pas s'exprimer correctement en anglais.
- Il aurait aidé si vous ne supprimez pas votre commentaire... C'était évidemment le sarcasme bien. S. O. a toujours été pleine de élitistes et étroite d'esprit snobs. Ce n'est pas vraiment le S. O. de la faute, je ne pense pas, mais une faille avec l'humanité qui obtient mis sur l'affichage en très bonne place ici. Comme pour les anglophones: il existe une certaine sensibilité pour les deux côtés; je ne peux parler que de l'argument lui-même cependant.
- Utilisation commons-lang. Josh Bloch dit: "Connaître et utiliser les bibliothèques.[...] ne pas réinventer la roue.Si vous avez besoin de faire quelque chose qui semble comme il devrait être assez commun,il y a peut-être déjà une classe dans les bibliothèques qui fait ce que vous voulez. Si il n'y a, à l'utiliser; si vous ne savez pas, vérifier.[...]De la bibliothèque de code est susceptible d'être mieux que le code que vous écrirez vous-même, et devrait s'améliorer au fil du temps.Ce n'est pas une réflexion sur vos capacités en tant que programmeur.Les économies d'échelle qui dictent code de la bibliothèque reçoit beaucoup plus d'attention que la plupart des développeurs pouvaient se permettre de consacrer à la même fonctionnalité."
Vous devez vous connecter pour publier un commentaire.
On peut utiliser la méthode suivante pour convertir un
Exception
trace de la pile àString
. Cette classe est disponible dans Apache commons-lang, qui est la plus commune dépendant de la bibliothèque avec de nombreux modèles de sources ouvertesorg.apache.commons.lang.exception à la règle.ExceptionUtils.getStackTrace(Throwable)
org.apache.commons.lang3.exception.ExceptionUtils
.Utilisation
Throwable.printStackTrace(PrintWriter pw)
pour envoyer la trace de la pile à un écrivain.StringWriter
etPrintWriter
?pw.flush()
avantsw.toString()
. Par défautPrintWriter
n'est pas réglé tu rincer automatiquement.PrintWriter
ferme juste le délégué de l'objet. Et de clôtureStringWriter
ne pas faire n'importe quoi. Il n'est pas utiliser pour appelerPrintWriter.flush()
, comme cela est applicable lorsque vous utilisez un tampon de fluxPrintStream
au lieu dePrintWriter
a bien fonctionné.Cela devrait fonctionner:
printStackTrace
faut juste retour de la chaîne, laissant la décision à savoir si l'imprimer ou non à l'utilisateur 🙂printXXX()
doit imprimer XXX.Si vous développez pour Android, un moyen plus facile est d'utiliser cette:
Le format est le même que getStacktrace, par exemple, pour
Log.e("TAG", "My message", new Throwable());
Goyave est
Throwables
classeSi vous avez la réelle
Throwable
exemple, Google Goyave fournitThrowables.getStackTraceAsString()
.Exemple:
AVERTISSEMENT: Ne comprend pas la cause (qui est généralement utile peu!)
String.format("%n")
ou quelque chose de semblable au lieu de"\n"
de faire des DOS lamers heureux.Pour moi la plus propre et la plus simple est:
StringWriter
etPrintWriter
objets doivent êtreclose
d....(ou je suppose que seul lePrintWriter
doit être fermé depuis la fermeture il faut fermer laStringWriter
trop)Le code suivant vous permet d'obtenir l'ensemble de la stackTrace avec un
String
format, sans l'aide d'Api comme log4J ou mêmejava.util.Logger
:Ici est une version qui est la copie pastable directement dans le code:
Ou, dans un bloc catch
Throwable
est définie, non?Impression trace de la pile à chaîne
C'est utile lorsque vous souhaitez imprimer le thread courant trace de la pile sans créer d'instance de
Throwable
- mais notez que la création de nouveauxThrowable
et l'obtention de trace de la pile à partir de là est effectivement plus rapide et moins cher que d'appelerThread.getStackTrace
.Est la façon la plus facile de convertir le résultat en Chaîne
J'utilise dans mon programme pour imprimer la trace de la pile
Imprimer la stacktrace à un PrintStream, puis de le convertir en une Chaîne de caractères
Intelligent, des tirs à la première série d'observations a été très amusant, mais cela dépend vraiment de ce que vous essayez de faire.
Si vous ne disposez pas déjà de la bibliothèque correcte, puis 3 lignes de code (comme dans D. Wroblewski de réponse) est parfait.
Otoh, que, si vous avez déjà apache.communes de la bibliothèque (comme la plupart des grands projets), puis Amar réponse est plus court.
OK, ça peut vous prendre dix minutes pour aller à la bibliothèque et à l'installer correctement (du moins si vous savez ce que vous faites). Mais le temps est compté, donc vous ne pouvez pas avoir du temps à perdre.
Jarek Przygódzki avait une intéressante mise en garde--"Si vous n'avez pas besoin exceptions imbriquées".
Mais si je ne besoin de toute la stack trace, imbriquées et tout? Dans ce cas, le secret est d'utiliser apache.commune de getFullStackTrace (voir http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/exception/ExceptionUtils.html#getFullStackTrace%28java.lang.Throwable%29)
Il a sauvé mon bacon. Merci, Amar, pour l'astuce!
Code de Apache Commons Lang 3.4 (JavaDoc):
La différence avec les autres réponses, c'est que il utilise
autoFlush
sur lePrintWriter
.Kotlin
L'extension de la classe Throwable qui va vous donner la propriété de Chaîne
error.stackTraceString
:Sans
java.io.*
il peut être fait comme ça.Et puis le
trace
variable contient votre trace de la pile. La sortie est également titulaire de la cause initiale, la sortie est identique àprintStackTrace()
Exemple,
printStackTrace()
rendements:La
trace
Chaîne détient, lors de l'impression destdout
si vous êtes à l'aide de java 8, essayez cette
vous pouvez trouver le code pour getStackTrace() fonction fournie par l'Throwable.java comme :
et pour StackTraceElement, des prestataires de services informatiques toString comme:
Donc juste rejoindre le StackTraceElement avec "\n"
un exapansion sur le Gala de la réponse qui comprennent également les causes de l'exception:
Mon oneliner pour convertir la trace de la pile pour le joint multi-ligne de chaîne:
Facile de passer à l'enregistreur de données "comme est".
printStackTrace()
Ici vous perdrez: 1) Exception qui a été levée; 2) les Causes et leurs stacktraceprintStackTrace()
n'a jamais été une partie de la question.La solution est pour convertir la stackTrace de tableau de string type de données. Voir l'exemple suivant:
Si vous ne souhaitez pas utiliser une bibliothèque externe et vous n'êtes pas le développement de pour Android, vous pouvez créer une la "vulgarisation" de la méthode comme ceci:
Vieille question, mais je voudrais juste ajouter le cas particulier où vous ne souhaitez pas imprimer tous la pile,
en supprimant certaines parties vous n'êtes pas réellement intéressé, à l'exclusion de certaines classes ou de packages.
Au lieu d'un
PrintWriter
utiliser unSelectivePrintWriter
:Où la
SelectivePrintWriter
classe est donnée par:Veuillez noter que cette classe peut être facilement adapté pour filtrer par Regex,
contains
ou d'autres critères. Notez également qu'il dépendThrowable
détails de mise en œuvre (pas susceptible de changer, mais quand même).Lorsque vous exécutez le programme, la sortie sera quelque chose de similaire:
Scala version
Avertissement: C'est peut-être un peu hors sujet, mais bon... 😉
Je ne sais pas ce que les affiches originales raison a été de vouloir la trace de la pile comme une chaîne de caractères dans la première place. Lorsque la trace de la pile devrait se retrouver dans une SLF4J/Logback JOURNAL, mais aucune exception n'a été ou devrait être jeté voici ce que je fais:
Je l'aime parce qu'il ne nécessite pas une bibliothèque externe (autre que votre enregistrement en arrière-plan, qui sera mis en place la plupart du temps de toute façon, bien sûr).
Quelques options
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();
À l'aide de Google Goyave lib
String stackTrace = Throwables.getStackTraceAsString ( myException ) ;
org.apache.commons.lang.exception à la règle.ExceptionUtils.getStackTrace(Throwable)
J'ai écrit quelques méthodes pour ça il y a longtemps, alors je me suis dit pourquoi ne pas jeter mon grain de sel à ce.
Exemple:
Imprime: