1747 Stimmen

Wie kann ich einen Stack-Trace in eine Zeichenkette umwandeln?

Wie konvertiert man am einfachsten das Ergebnis von Throwable.getStackTrace() zu einer Zeichenkette, die den Stacktrace darstellt?

8 Stimmen

Die Antwort von jqno verwendet nämlich die Methode Throwable.getStackTrace(), die Sie in Ihrer Frage angegeben haben, während Brian dies nicht tut. Er verwendet stattdessen Throwable.printStackTrace().

10 Stimmen

So gut wie jedes Java-Projekt sollte Apache commons-lang enthalten. Es enthält viele bequeme Methoden, die extrem häufige Entwicklungsanforderungen implementieren.

20 Stimmen

@StijndeWitt Diese drei Codezeilen müssen mit ziemlicher Sicherheit von der Stelle, an der Sie sie aufgerufen haben, ausgeklammert werden. Da Sie nicht wissen, wohin sie gehören, landen sie in Ihrer Utility-Toolbox mit all den anderen nützlichen Schnipseln. Bingo! Sie haben gerade Guava / Commons-Lang / was auch immer neu erfunden... nur nicht so gut. Importieren Sie stattdessen eine vernünftige Utility-Bibliothek und erfinden Sie das Rad nicht neu. Das wahre Zeichen eines Anfängers ist es, zu glauben, dass man es besser machen kann als die Autoren der Bibliothek.

11voto

eddyrokr Punkte 404
private String getCurrentStackTraceString() {
    StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
    return Arrays.stream(stackTrace).map(StackTraceElement::toString)
            .collect(Collectors.joining("\n"));
}

10voto

IvanRF Punkte 6745

Code von Apache Commons Lang 3.4 ( JavaDoc ):

public static String getStackTrace(final Throwable throwable) {
    final StringWriter sw = new StringWriter();
    final PrintWriter pw = new PrintWriter(sw, true);
    throwable.printStackTrace(pw);
    return sw.getBuffer().toString();
}

Der Unterschied zu den anderen Antworten besteht darin, dass es verwendet autoFlush über die PrintWriter .

9voto

ivanjermakov Punkte 950

Mit Java 8 Stream-API können Sie etwa so vorgehen:

Stream
    .of(throwable.getStackTrace())
    .map(StackTraceElement::toString)
    .collect(Collectors.joining("\n"));

Es nimmt ein Array von Stack-Trace-Elementen, konvertiert sie in einen String und fügt sie zu einem mehrzeiligen String zusammen.

8 Stimmen

Diese Lösung entfernt die Meldung und ignoriert alle übergeordneten Spuren

9voto

Tihamer Punkte 835

Die cleveren Sticheleien in den ersten Kommentaren waren sehr amüsant, aber es kommt wirklich darauf an, was man zu tun versucht. Wenn Sie noch nicht über die richtige Bibliothek verfügen, dann sind 3 Zeilen Code (wie in der Antwort von D. Wroblewski) perfekt. Wenn Sie jedoch bereits die apache.commons-Bibliothek haben (was bei den meisten großen Projekten der Fall ist), ist die Antwort von Amar kürzer. OK, Sie brauchen vielleicht zehn Minuten, um die Bibliothek zu besorgen und sie korrekt zu installieren (weniger als eine, wenn Sie wissen, was Sie tun). Aber die Uhr tickt, also haben Sie vielleicht nicht die Zeit, die Sie erübrigen können. Jarek Przygódzki hatte einen interessanten Vorbehalt: "Wenn Sie keine verschachtelten Ausnahmen brauchen".

Aber was, wenn ich tun die vollständigen Stack Traces benötigen, verschachtelt und alles? In diesem Fall besteht das Geheimnis darin, die Funktion 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 )

Das hat mir den Hintern gerettet. Danke, Amar, für den Tipp!

8voto

Gala Punkte 2324

Ohne java.io.* kann es so gemacht werden.

String trace = e.toString() + "\n";                     

for (StackTraceElement e1 : e.getStackTrace()) {
    trace += "\t at " + e1.toString() + "\n";
}   

Und dann die trace enthält Ihre Stack-Trace-Variable. Die Ausgabe enthält auch die ursprüngliche Ursache, die Ausgabe ist identisch mit printStackTrace()

Beispiel, printStackTrace() Erträge:

java.io.FileNotFoundException: / (Is a directory)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
    at Test.main(Test.java:9)

Le site trace String hält, wenn er nach stdout

java.io.FileNotFoundException: / (Is a directory)
     at java.io.FileOutputStream.open0(Native Method)
     at java.io.FileOutputStream.open(FileOutputStream.java:270)
     at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
     at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
     at Test.main(Test.java:9)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X