2009-04-01 6 views
32

Do celów diagnostycznych czasami potrzebuję przechowywać stos wywołujący, który prowadzi do danego przejścia stanu (na przykład przyznanie blokady, zatwierdzenie transakcji itp.), Aby coś poszło nie tak później mogę dowiedzieć się, kto pierwotnie spowodował zmianę stanu.Określanie aktualnego stosu wywołań (do celów diagnostycznych)

Obecnie jedynym sposobem mam świadomość odzyskać stosu wywołań wygląda poniższym fragmencie kodu, który uważam za strasznie brzydka:

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

Czy ktoś wie o lepszy sposób, aby osiągnąć ten cel?

Odpowiedz

67

Myślę, że można dostać to samo z:

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

Cóż, możesz nieco poprawić, nie rzucając wyjątku.

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

Faktycznie, właśnie sprawdziłem: konstruktor nazywa fillInStackTrace() już. Więc można uprościć do:

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

To jest rzeczywiście to, co robi Thread.getStackTrace() jeśli to się nazywa na bieżącym wątku, więc można go używać zamiast wolą.

+0

Nie potrzeba 'fillInStackTrace' (chociaż nie jest łatwo czytać jego dokumenty API w tył). –

2

Jeśli chcesz ją jako ciąg i użyć Apache Commons:

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