1696 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.

120voto

jqno Punkte 14613

WARNUNG: Beinhaltet nicht die Ursache (was normalerweise der nützliche Teil ist!)

public String stackTraceToString(Throwable e) {
    StringBuilder sb = new StringBuilder();
    for (StackTraceElement element : e.getStackTrace()) {
        sb.append(element.toString());
        sb.append("\n");
    }
    return sb.toString();
}

108voto

Vladas Diržys Punkte 1318

Für mich war das der sauberste und einfachste Weg:

import java.util.Arrays;
Arrays.toString(e.getStackTrace());

43 Stimmen

Der Code ist sauber, aber die Ausgabe ist es nicht. Sie müssen ein .replaceAll(", ", " \n ") am Ende. Allerdings verlieren Sie die Einrückung, die printStackTrace vorschlägt.

6 Stimmen

Dies ist nützlich, wenn Sie Trace in einer einzigen Zeile protokollieren

30voto

Akira Yamamoto Punkte 4406
public static String getStackTrace(Throwable t) {
    StringWriter sw = new StringWriter();
    t.printStackTrace(new PrintWriter(sw));
    return sw.toString();
}

1 Stimmen

Hallo, ich möchte nur darauf hinweisen, dass im Kommentarteil der zitierten Antwort darauf hingewiesen wird, dass die StringWriter y PrintWriter Objekte sollten sein close d....(oder ich schätze, nur die PrintWriter muss geschlossen werden, da das Schließen die StringWriter zu)

27voto

dumonderic Punkte 1149

Der folgende Code ermöglicht es Ihnen, den gesamten StackTrace mit einer String Format, ohne Verwendung von APIs wie log4J oder sogar java.util.Logger :

catch (Exception e) {
    StackTraceElement[] stack = e.getStackTrace();
    String exception = "";
    for (StackTraceElement s : stack) {
        exception = exception + s.toString() + "\n\t\t";
    }
    System.out.println(exception);
    // then you can send the exception string to a external file.
}

23voto

rouble Punkte 13722

Hier ist eine Version, die direkt in den Code eingefügt werden kann:

import java.io.StringWriter; 
import java.io.PrintWriter;

//Two lines of code to get the exception into a StringWriter
StringWriter sw = new StringWriter();
new Throwable().printStackTrace(new PrintWriter(sw));

//And to actually print it
logger.info("Current stack trace is:\n" + sw.toString());

Oder, in einem Catch-Block

} catch (Throwable t) {
    StringWriter sw = new StringWriter();
    t.printStackTrace(new PrintWriter(sw));
    logger.info("Current stack trace is:\n" + sw.toString());
}

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