Frage Wie kann ich eine Stapelverfolgung in eine Zeichenfolge konvertieren?


Was ist der einfachste Weg, um das Ergebnis von zu konvertieren? Throwable.getStackTrace() zu einer Zeichenfolge, die den Stacktrace darstellt?


1212
2017-07-19 11:31


Ursprung


Antworten:


Man kann die folgende Methode verwenden, um ein zu konvertieren Exception Stapelverfolgung zu String. Diese Klasse ist verfügbar in Apache commons-lang ist die am häufigsten verwendete abhängige Bibliothek mit vielen populären offenen Quellen

org.apache.commons.lang.exception.ExceptionUtils.getStackTrace(Throwable)


846
2018-01-21 14:39



Benutzen Throwable.printStackTrace (PrintWriter pw) um die Stapelverfolgung an einen geeigneten Schreiber zu senden.

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

// ...

StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
String sStackTrace = sw.toString(); // stack trace as a string
System.out.println(sStackTrace);

1934
2017-07-19 11:36



Das sollte funktionieren:

StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();

395
2017-07-19 11:41



Wenn Sie für Android entwickeln, ist es ein viel einfacherer Weg, dies zu verwenden:

import android.util.Log;

String stackTrace = Log.getStackTraceString(exception); 

Das Format ist dasselbe wie getStackTrace, z.

09-24 16:09:07.042: I/System.out(4844): java.lang.NullPointerException
09-24 16:09:07.042: I/System.out(4844):   at com.temp.ttscancel.MainActivity.onCreate(MainActivity.java:43)
09-24 16:09:07.042: I/System.out(4844):   at android.app.Activity.performCreate(Activity.java:5248)
09-24 16:09:07.043: I/System.out(4844):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread.access$800(ActivityThread.java:139)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
09-24 16:09:07.043: I/System.out(4844):   at android.os.Handler.dispatchMessage(Handler.java:102)
09-24 16:09:07.043: I/System.out(4844):   at android.os.Looper.loop(Looper.java:136)
09-24 16:09:07.044: I/System.out(4844):   at android.app.ActivityThread.main(ActivityThread.java:5097)
09-24 16:09:07.044: I/System.out(4844):   at java.lang.reflect.Method.invokeNative(Native Method)
09-24 16:09:07.044: I/System.out(4844):   at java.lang.reflect.Method.invoke(Method.java:515)
09-24 16:09:07.044: I/System.out(4844):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
09-24 16:09:07.044: I/System.out(4844):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)

181
2018-04-30 07:29



WARNUNG: Enthält keine Ursache (was normalerweise das nützliche Bit 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();
}

106
2017-07-19 11:38



Guavas Throwables Klasse

Wenn Sie die tatsächliche haben Throwable Beispiel, Google Guava bietet Throwables.getStackTraceAsString().

Beispiel:

String s = Throwables.getStackTraceAsString ( myException ) ;

95
2018-02-15 10:20



Für mich war der sauberste und einfachste Weg:

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

79
2017-12-15 14:37



Mit dem folgenden Code können Sie den gesamten StackTrace mit einem String Format, ohne APIs wie log4J oder sogar zu verwenden 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.
}

25
2017-10-24 16:57



Inspiriert von @ Brian Agnew:

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

25
2017-10-03 19:15



Hier ist eine Version, die direkt in Code kopiert 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());
}

18
2018-06-12 16:15