Was ist der einfachste Weg, um das Ergebnis Throwable.getStackTrace()
in eine Zeichenfolge zu konvertieren , die die Stapelverfolgung darstellt?
java
stack-trace
tostring
ripper234
quelle
quelle
Antworten:
Mit der folgenden Methode können Sie einen
Exception
Stack-Trace in konvertierenString
. Diese Klasse ist in Apache commons-lang verfügbar, der am häufigsten verwendeten abhängigen Bibliothek mit vielen gängigen Open Source-Quellenorg.apache.commons.lang.exception.ExceptionUtils.getStackTrace(Throwable)
quelle
org.apache.commons.lang3.exception.ExceptionUtils
.Verwenden Sie
Throwable.printStackTrace(PrintWriter pw)
diese Option , um den Stack-Trace an einen geeigneten Writer zu senden.quelle
StringWriter
und nicht schließenPrintWriter
?Das sollte funktionieren:
quelle
printStackTrace
sollte nur eine Zeichenfolge zurückgeben und die Entscheidung darüber, ob sie gedruckt werden soll oder nicht, dem BenutzerprintXXX()
sollte XXX drucken.Wenn Sie für Android entwickeln, ist dies weitaus einfacher:
Das Format ist das gleiche wie bei getStacktrace, z
quelle
Log.e("TAG", "My message", new Throwable());
Guave
Throwables
KlasseWenn Sie die aktuelle
Throwable
Instanz haben, bietet Google GuavaThrowables.getStackTraceAsString()
.Beispiel:
quelle
WARNUNG: Enthält keine Ursache (was normalerweise das nützliche Bit ist!)
quelle
String.format("%n")
oder etwas Ähnliches, anstatt"\n"
DOS-Lamers glücklich zu machen.Für mich war der sauberste und einfachste Weg:
quelle
quelle
StringWriter
undPrintWriter
Objekteclose
d sein sollten .... (oder ich denke, nur diePrintWriter
müssen geschlossen werden, da das Schließen auch das schließen sollteStringWriter
)Mit dem folgenden Code können Sie die gesamte stackTrace in einem
String
Format abrufen , ohne APIs wie log4J oder sogar zu verwendenjava.util.Logger
:quelle
Hier ist eine Version, die direkt in Code kopiert werden kann:
Oder in einem Fangblock
quelle
Throwable
definiert ist, richtig?Ist der einfachste Weg, das Ergebnis in einen String zu konvertieren. Ich verwende dies in meinem Programm, um den Stack-Trace zu drucken
quelle
Drucken Sie die Stapelverfolgung in a
PrintStream
und konvertieren Sie sie dann in aString
:quelle
Stack-Trace in String drucken
Dies ist nützlich, wenn Sie den aktuellen Thread-Stack-Trace drucken möchten, ohne eine Instanz von zu erstellen.
Throwable
Beachten Sie jedoch, dass das Erstellen eines neuenThrowable
und das Abrufen des Stack-Trace von dort tatsächlich schneller und billiger ist als das AufrufenThread.getStackTrace
.quelle
Kotlin
Wenn Sie die Throwable-Klasse erweitern, erhalten Sie die String-Eigenschaft
error.stackTraceString
:quelle
quelle
Das clevere Sniping in den ersten Kommentaren war sehr amüsant, aber es hängt wirklich davon ab, was Sie versuchen zu tun. Wenn Sie noch nicht die richtige Bibliothek haben, sind 3 Codezeilen (wie in der Antwort von D. Wroblewski) perfekt. OTOH, wenn Sie bereits über die Bibliothek apache.commons verfügen (wie es die meisten großen Projekte tun), ist Amars Antwort kürzer. OK, es kann zehn Minuten dauern, bis Sie die Bibliothek abgerufen und korrekt installiert haben (weniger als eine, wenn Sie wissen, was Sie tun). Aber die Uhr tickt, so dass Sie möglicherweise nicht die Zeit haben, um zu sparen. Jarek Przygódzki hatte eine interessante Einschränkung - "Wenn Sie keine verschachtelten Ausnahmen benötigen".
Aber was , wenn ich Sie den vollständigen Stack - Traces benötigen, verschachtelt und alle? In diesem Fall besteht das Geheimnis darin, getFullStackTrace von apache.common zu verwenden (siehe http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/exception/ExceptionUtils.html) # getFullStackTrace% 28java.lang.Throwable% 29 )
Es hat meinen Speck gerettet. Danke, Amar, für den Hinweis!
quelle
Code aus Apache Commons Lang 3.4 ( JavaDoc ):
Der Unterschied zu den anderen Antworten besteht darin, dass es
autoFlush
auf der verwendet wirdPrintWriter
.quelle
Ohne das geht
java.io.*
es so.Und dann enthält die
trace
Variable Ihre Stapelverfolgung. Die Ausgabe enthält auch die ursprüngliche Ursache, die Ausgabe ist identisch mitprintStackTrace()
Beispiel
printStackTrace()
ergibt:Die
trace
Zeichenfolge gilt beim Drucken aufstdout
quelle
Scala-Version
quelle
Wenn Sie Java 8 verwenden, versuchen Sie dies
Den Code für die
getStackTrace()
Funktion finden SieThrowable.java
unter:und für
StackTraceElement
AnbietertoString()
wie:Also einfach
StackTraceElement
mit "\ n" verbinden.quelle
eine Erklärung zu Galas Antwort, die auch die Ursachen für die Ausnahme enthält:
quelle
Die Lösung besteht darin, die stackTrace des Arrays in einen String- Datentyp zu konvertieren . Siehe folgendes Beispiel:
quelle
Mit der Java 8 Stream API können Sie Folgendes tun:
Es werden Arrays von Stack-Trace-Elementen verwendet, in Zeichenfolgen konvertiert und zu mehrzeiligen Zeichenfolgen zusammengefügt.
quelle
Mein Oneliner zum Konvertieren der Stapelverfolgung in die beiliegende mehrzeilige Zeichenfolge:
Einfach an den Logger "wie es ist" zu übergeben.
quelle
printStackTrace()
hier unterscheidet. Sie verlieren: 1) Ausnahme, die geworfen wurde; 2) Ursachen und ihreprintStackTrace()
Nie ein Teil der Frage war.Wenn Sie keine externe Bibliothek verwenden möchten und nicht für Android entwickeln , können Sie eine Erweiterungsmethode wie die folgende erstellen :
quelle
Alte Frage, aber ich möchte nur den Sonderfall hinzufügen, in dem Sie nicht den gesamten Stapel drucken möchten , indem Sie einige Teile entfernen, an denen Sie eigentlich nicht interessiert sind, mit Ausnahme bestimmter Klassen oder Pakete.
Anstelle einer
PrintWriter
Verwendung aSelectivePrintWriter
:Wo die
SelectivePrintWriter
Klasse gegeben ist durch:Bitte beachten Sie, dass diese Klasse leicht angepasst werden kann, um nach Regex
contains
oder anderen Kriterien herauszufiltern . Beachten Sie auch, dass dies von denThrowable
Implementierungsdetails abhängt (wahrscheinlich nicht geändert, aber immer noch).quelle
Wenn Sie das Programm ausführen, ist die Ausgabe ähnlich:
quelle
Ich frage mich, warum niemand erwähnt hat
ExceptionUtils.getStackFrames(exception)
Für mich ist es der bequemste Weg, Stacktrace mit all seinen Ursachen bis zum Ende zu sichern:
quelle
Warnung: Dies mag ein bisschen vom Thema abweichen, aber na ja ...;)
Ich weiß nicht, warum der ursprüngliche Postergrund dafür war, dass der Stack-Trace überhaupt als Zeichenfolge verwendet werden sollte. Wenn der Stack-Trace in einem SLF4J / Logback-LOG enden sollte, aber keine Ausnahme ausgelöst wurde oder werden sollte, gehe ich folgendermaßen vor:
Ich mag es, weil es keine externe Bibliothek erfordert (außer Ihrem Protokollierungs-Backend, das natürlich sowieso die meiste Zeit vorhanden sein wird).
quelle
Nur wenige Optionen
StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); String exceptionAsString = sw.toString();
Verwenden von Google Guava lib
String stackTrace = Throwables.getStackTraceAsString ( myException ) ;
org.apache.commons.lang.exception.ExceptionUtils.getStackTrace (Throwable)
quelle