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.

23voto

Baked Inhalf Punkte 2844

Drucken Sie den Stack-Trace in ein PrintStream und konvertieren ihn dann in eine String :

// ...

catch (Exception e)
{
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    e.printStackTrace(new PrintStream(out));
    String str = new String(out.toByteArray());

    System.out.println(str);
}

21voto

Ramanan Durairaj Punkte 228
Arrays.toString(thrown.getStackTrace())

Ist der einfachste Weg, das Ergebnis in einen String zu konvertieren Ich verwende dies in meinem Programm, um den Stack-Trace zu drucken

LOGGER.log(Level.SEVERE, "Query Builder Issue Stack Trace : {0} ,Message : {1} objid {2}", new Object[]{Arrays.toString(e.getStackTrace()), e.getMessage(),objId});

19voto

vonox7 Punkte 944

Kotlin >= 1.4

Verwenden Sie die integrierte Funktion stackTraceToString() in einem Throwable .

Kotlin < 1.4

Durch die Erweiterung der Klasse Throwable erhalten Sie die Eigenschaft String error.stackTraceString :

val Throwable.stackTraceString: String
  get() {
    val sw = StringWriter()
    val pw = PrintWriter(sw)
    this.printStackTrace(pw)
    return sw.toString()
  }

0 Stimmen

Ab Kotlin 1.4 gibt es jetzt eine eingebaute API, um dies zu tun kotlinlang.org/api/latest/jvm/stdlib/kotlin/

14voto

Pengcheng Zhang Punkte 131

Wenn Sie Java 8 verwenden, versuchen Sie Folgendes

Arrays.stream(e.getStackTrace())
                .map(s->s.toString())
                .collect(Collectors.joining("\n"));

finden Sie den Code für getStackTrace() Funktion, die von Throwable.java als:

public StackTraceElement[] getStackTrace() {
    return getOurStackTrace().clone();
}

und für StackTraceElement bietet sie toString() wie folgt:

public String toString() {
    return getClassName() + "." + methodName +
        (isNativeMethod() ? "(Native Method)" :
         (fileName != null && lineNumber >= 0 ?
          "(" + fileName + ":" + lineNumber + ")" :
          (fileName != null ?  "("+fileName+")" : "(Unknown Source)")));
}

Treten Sie also einfach dem StackTraceElement mit " \n ".

0 Stimmen

Und wenn Sie es einschränken wollen, können Sie die Methode limit(5) für den Stream verwenden.

12voto

Jarek Przygódzki Punkte 4004

Stacktrace in String drucken

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

public class StackTraceUtils {
    public static String stackTraceToString(StackTraceElement[] stackTrace) {
        StringWriter sw = new StringWriter();
        printStackTrace(stackTrace, new PrintWriter(sw));
        return sw.toString();
    }
    public static void printStackTrace(StackTraceElement[] stackTrace, PrintWriter pw) {
        for(StackTraceElement stackTraceEl : stackTrace) {
            pw.println(stackTraceEl);
        }
    }
}

Es ist nützlich, wenn Sie den aktuellen Thread-Stack-Trace ausgeben wollen, ohne eine Instanz von Throwable - aber beachten Sie, dass das Erstellen neuer Throwable und das Abrufen von Stack Trace von dort ist tatsächlich schneller und billiger als der Aufruf von Thread.getStackTrace .

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