Wie füge ich in Java einen Stacktrace zu meinem Debugging-Ausdruck hinzu?
Frage
Was ist der einfachste Weg, einen Stacktrace aus einem Debugging-Ausdruck zu drucken?Während des Testens möchten Sie häufig den Callstack kennen, der zu der Situation führt, die eine Debug-Meldung auslöst.
Lösung
Andere Tipps
Wenn Sie mit log4j
Exception e = new Exception();
log.error("error here", e);
wird den Stacktrace zu Ihrem Protokoll drucken.
Wenn Sie den Stack-Trace in einen String zu speichern, dies zu tun;
String exception = "";
for (StackTraceElement element : e.getStackTrace())
exception += element.toString() + "\n";
Wo e ist offensichtlich eine Ausnahme.
Außerdem ist es klingt sehr seltsam eine eigene Exception automatisch generieren nur für einen Debug eine Stack-Trace erhalten zu finden. Erhalten Sie Eclipse und es ist Debug-Modus verwenden, es ist wirklich genial.
Nur eine willkürliche Ausnahme zu schaffen funktioniert der Trick für mich:
System.out.println("Oops, the bad thing happened");
new IllegalStateException().printStackTrace();
Wie auch, was @jjnguy gesagt, wenn Sie eine Ausnahme nicht haben, können Sie auch anrufen Thread.getStackTrace ().
Sie sollten die Ausnahme in einem Try-Catch-Block werden zu kontrollieren.
e.getStackTrace();
Das gibt StackTraceElement [], dass Sie können dann interpretieren.
Auch:
e.printStackTrace()
wird ... drucken Sie die Stacktrace.
Um einfach den aktuellen Stack-Trace auf stderr zu drucken, können Sie anrufen:
Thread.dumpStack();
, die sich nur Anrufe:
new Exception("Stack trace").printStackTrace();
Für die Ausgabe auf stdout , anstatt stderr, System.out
passieren printStackTrace()
:
new Exception("Stack trace").printStackTrace(System.out);
Nur weil ich es selbst benötigt:
Wie Antwort inspiriert Wie kann ich den Anrufer eines Verfahrens unter Verwendung stacktrace oder Reflexion finden? , können Sie den Call-Stack mit
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace()
Dann sind Sie bearbeiten und drucken / log, was Sie interessiert sind. Mehr Arbeit als Thread.dumpStack()
verwenden, aber flexibler.