2008-09-10 22 views

Odpowiedz

8
+0

Minusem jest to, że dumpStack() przechodzi tylko na stderr i nie można go wysłać gdzie indziej, jak to możliwe, z wyjątkiem lub Thread.getStackTrace(). –

+4

Użyj rejestrowania. Drukowanie na stdout/stderr powinno być wykonywane tylko przez narzędzia systemu operacyjnego i aplikacje "Hello World". –

2

Powinieneś wychwycić wyjątek w bloku try-catch.

e.getStackTrace(); 

To zwraca wartość StackTraceElement [], którą następnie można zinterpretować.

również:

e.printStackTrace() 

... będzie wydrukować StackTrace.

4

tylko tworzenie dowolnej wyjątek załatwia sprawę dla mnie:

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

Powinieneś susić t użyj Thread.getStackTrace(). – jjnguy

+0

Wierzę, że ta metoda spowoduje ostrzeżenie w niektórych środowiskach IDE, takich jak IntelliJ, ponieważ tworzysz wyjątek, ale go nie rzucasz. Polecam metodę Thread.getStackTrace(), która ma tę samą logikę, ale jest ukryta przed programistą. –

+0

Thread.dumpStack() jest łatwiejszy, jeśli chcesz go wysłać do stderr (zapisuje, że musisz zapętlić elementy śledzenia stosu samemu). –

3

Jak również co @jjnguy powiedział, jeśli nie ma wyjątku, można również zadzwonić Thread.getStackTrace().

4

Jeśli chcesz zapisać ślad stosu do łańcucha można to zrobić;

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

Gdzie e jest, oczywiście, wyjątkiem.

Poza tym, wydaje się bardzo dziwne, aby autogenerować własny wyjątek tylko po to, aby znaleźć ślad stosu do debugowania. Zyskaj Eclipse i korzystaj z jego trybu debugowania, jest naprawdę świetny.

+0

Czy nie powinno się także krokować lub recurse przez e.getCause(), a także pobierać śledzenie stosu dla tych wszystkich? – slim

+0

Nie wierzę, że istnieje przyczyna, gdy robisz to w ten sposób. – Chris

+0

Użyj 'StringBuilder' zamiast' String' dla wielu konkatenacji. – minipif

16

Jeśli używasz LOG4J

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

wydrukuje StackTrace do swojego dziennika.

+0

+1 za niestosowanie stdout/stderr –

1

Tylko dlatego musiałem to sam.

Jak zainspirowany odpowiedź How do I find the caller of a method using stacktrace or reflection?, można odzyskać stos wywołań za pomocą

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

Następnie przetwarzać i drukować/log cokolwiek jesteś zainteresowany Więcej pracy niż używanie Thread.dumpStack(), ale bardziej elastyczne.

1

po prostu wydrukować bieżący ślad stosu do stderr, można zadzwonić:

Thread.dumpStack(); 

która sama właśnie nazywa:

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

Do wyjścia do stdout zamiast stderr, przechodzą System.out do printStackTrace():

new Exception("Stack trace").printStackTrace(System.out); 
Powiązane problemy