Was ist der einfachste Weg, um einen Stacktrace von einem Debugging-Ausdruck zu drucken? Oft möchten Sie während des Tests den Callstack kennen, der zu der Situation führt, die eine Debug-Nachricht provoziert.Wie kann ich in Java einen Stacktrace zu meinem Debugging-Ausdruck hinzufügen?
Antwort
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.
einfach eine willkürliche Ausnahme zu schaffen funktioniert der Trick für mich:
System.out.println("Oops, the bad thing happened");
new IllegalStateException().printStackTrace();
Sie sollten jus t verwende Thread.getStackTrace(). – jjnguy
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. –
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). –
Neben was @jjnguy sagte, wenn Sie nicht eine Ausnahme haben, können Sie auch Thread.getStackTrace() aufrufen.
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.
Wenn Sie log4j
Exception e = new Exception();
log.error("error here", e);
verwenden die Stacktrace zu Ihrem Protokoll ausdrucken.
+1 für nicht mit stdout/stderr –
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.
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);
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. –
Verwenden Sie die Protokollierung. Das Drucken nach stdout/stderr sollte nur von Betriebssystemprogrammen und "Hello World" -Apps durchgeführt werden. –