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.

2357voto

Brian Agnew Punkte 260470

Utilice Throwable.printStackTrace(PrintWriter pw) um den Stack-Trace an einen geeigneten Writer 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);

9 Stimmen

Dies trimmt den Stack-Trace auf die gleiche Weise wie printStackTrace(). Alle Ausnahmen im Stack sind sichtbar, aber für jede Ausnahme kann der Stack beschnitten werden. Jeder, der den gesamten Trace benötigt, sollte dies in Betracht ziehen.

9 Stimmen

Wie sich herausstellt, ist dies ziemlich genau das, was die Methode ExceptionUtils.getStackTrace() von Apache tut. Eigentlich fast buchstabengetreu.

7 Stimmen

@BrianAgnew, sollten Sie nicht die StringWriter y PrintWriter ?

1132voto

amar Punkte 11717

Man kann die folgende Methode verwenden, um eine Exception Stapelverfolgung zu String . Diese Klasse ist verfügbar in Apache Commons-Lang, die am häufigsten verwendete abhängige Bibliothek mit vielen beliebten offenen Quellen

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

88 Stimmen

@Stijn - um fair zu sein (ich habe die aktuell am höchsten bewertete Antwort unten geschrieben), lohnt sich ein Blick auf commons-lang für viel mehr Funktionalität

55 Stimmen

@StijndeWitt Commons Lang ist ziemlich verbreitet. Es ist bereits in den meisten meiner Projekte/Projekte bei der Arbeit vorhanden.

17 Stimmen

@Hugo danke, war im Begriff, den StringWriter zu verwenden, um das Hinzufügen einer neuen Bibliothek zu vermeiden - stellt sich heraus, dass es bereits eine Abhängigkeit von 3 meiner Abhängigkeiten ist. Also an den Rest, überprüfen Sie, ob Sie es bereits haben.

503voto

D. Wroblewski Punkte 7350

Das sollte funktionieren:

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

83 Stimmen

Prägnant im Zusammenhang mit Java ist immer komisch. Das printStackTrace sollte nur einen String zurückgeben und die Entscheidung, ob er gedruckt wird oder nicht, dem Benutzer überlassen :)

52 Stimmen

PrintStackTrace in der Konsole ausgeben ist akzeptabel, aber zumindest ein getStackTrace, das es als String zurückgibt, sollte standardmäßig verfügbar sein

7 Stimmen

Welcher Teil davon ist prägnant? Sie müssen 2 Objekte konstruieren, die nur dazu dienen, den Stack-Trace in einen String zu schreiben.

264voto

Vicky Kapadia Punkte 5915

Wenn Sie für Android entwickeln, ist es viel einfacher, diese Methode zu verwenden:

import android.util.Log;

String stackTrace = Log.getStackTraceString(exception); 

Das Format ist das gleiche wie bei getStacktrace, z.B.

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)

153voto

stumbav Punkte 1579

Guaven Throwables クラス

Wenn Sie die aktuelle Throwable Instanz, Google Guava bietet Throwables.getStackTraceAsString() .

Beispiel:

String s = Throwables.getStackTraceAsString ( myException ) ;

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