2009-04-01 8 views
32

Für Diagnosezwecke muss ich manchmal den Aufruf-Stack speichern, der zu einem bestimmten Statusübergang führt (z. B. Sperren gewähren, Transaktion bestätigen usw.), wenn etwas schief geht später kann ich herausfinden, wer ursprünglich den Zustandsübergang ausgelöst hat.Ermitteln des aktuellen Aufruf-Stacks (für diagnostische Zwecke)

Derzeit ist der einzige Weg, ich bin bewusst den Call-Stack abzurufen sieht aus wie der folgende Code-Schnipsel, die ich schrecklich hässlich betrachten:

StackTraceElement[] cause; 
try { 
    throw new Exception(); 
} catch (Exception e) { 
    cause = e.getStackTrace(); 
} 

Hat jemand einen besseren Weg wissen dies zu erreichen?

Antwort

67

Ich glaube, Sie die gleiche Sache mit bekommen:

StackTraceElement[] cause = Thread.currentThread().getStackTrace(); 
9

Nun, Sie können es leicht verbessern, indem Sie nicht die Ausnahme werfen.

Exception ex = new Exception(); 
ex.fillInStackTrace(); 
StackTraceElement[] cause = ex.getStackTrace(); 

Eigentlich habe ich gerade überprüft: Der Konstruktor ruft fillInStackTrace() bereits. So können Sie es vereinfachen:

StackTraceElement[] cause = new Exception().getStackTrace(); 

Das ist eigentlich das, was Thread.getStackTrace() tut, wenn es auf dem aktuellen Thread aufgerufen wird, so dass Sie vielleicht bevorzugen es stattdessen verwenden.

+0

Keine Notwendigkeit für 'fillInStackTrace' (obwohl es leicht ist, um seine API-Dokumente rückwärts zu lesen). –

2

Wenn Sie es als String und verwenden möchten Apache Commons:

org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(new Throwable()) 
Verwandte Themen