2008-09-10 5 views

Antwort

8
+0

Der Nachteil ist, dass dumpStack() nur zu stderr geht, und Sie können es nicht woanders senden, wie Sie mit einer Ausnahme oder Thread.getStackTrace() können. –

+4

Verwenden Sie die Protokollierung. Das Drucken nach stdout/stderr sollte nur von Betriebssystemprogrammen und "Hello World" -Apps durchgeführt werden. –

2

Sie sollten die Ausnahme in einem try-catch-Block abfangen.

e.getStackTrace(); 

Das gibt StackTraceElement [] zurück, das Sie dann interpretieren können.

auch:

e.printStackTrace() 

wird ... die stacktrace drucken.

4

einfach eine willkürliche Ausnahme zu schaffen funktioniert der Trick für mich:

System.out.println("Oops, the bad thing happened"); 
new IllegalStateException().printStackTrace(); 
+0

Sie sollten jus t verwende Thread.getStackTrace(). – jjnguy

+0

Ich glaube, dass diese Methode eine Warnung in einigen IDEs wie IntelliJ verursacht, da Sie eine Ausnahme erstellen, aber nicht werfen. Ich empfehle die Thread.getStackTrace() -Methode, die die gleiche Logik hat, aber vom Entwickler ausgeblendet ist. –

+0

Thread.dumpStack() ist einfacher, wenn Sie es nur an stderr senden möchten (es wird vermieden, dass Sie die Stack-Trace-Elemente selbst durchlaufen müssen). –

3

Neben was @jjnguy sagte, wenn Sie nicht eine Ausnahme haben, können Sie auch Thread.getStackTrace() aufrufen.

4

Wenn Sie den Stack-Trace in einen String speichern wollen, dies zu tun;

String exception = ""; 
for (StackTraceElement element : e.getStackTrace()) 
    exception += element.toString() + "\n"; 

Wo e ist natürlich eine Ausnahme.

Außerdem klingt es sehr seltsam, eine eigene Exception automatisch zu generieren, nur um einen Stack-Trace für ein Debug zu bekommen. Holen Sie Eclipse und verwenden Sie es Debug-Modus, es ist wirklich großartig.

+0

Sollte man nicht auch durch e.getCause() schreiten oder rekursiv werden und Stack-Traces für all diese bekommen? – slim

+0

Ich glaube nicht, dass es eine Ursache gibt, wenn du es so machst. – Chris

+0

Verwenden Sie 'StringBuilder' anstelle von' String' für mehrere Verkettungen. – minipif

16

Wenn Sie log4j

Exception e = new Exception(); 
log.error("error here", e); 

verwenden die Stacktrace zu Ihrem Protokoll ausdrucken.

+0

+1 für nicht mit stdout/stderr –

1

Nur weil ich es selbst benötigt.

Wie How do I find the caller of a method using stacktrace or reflection? durch Antwort inspiriert, können Sie den Call-Stack abrufen mit

StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace() 

Dann bearbeiten und drucken Sie/log, was Sie interessiert sind mehr Arbeit als mit Thread.dumpStack(), aber flexibler.

1

einfach Um den aktuellen Stack-Trace zu stderr zu drucken, können Sie anrufen:

Thread.dumpStack(); 

, die sich nur Anrufe:

new Exception("Stack trace").printStackTrace(); 

Zur Ausgabe auf stdout statt Stderr passieren System.out zu printStackTrace():

new Exception("Stack trace").printStackTrace(System.out); 
Verwandte Themen