2011-08-18 10 views
52

To prawdopodobnie pytanie dla początkujących, ale mam nadzieję, że możesz mi pomóc. :) Mam coś takiego:Korzystanie z e.printStackTrace() w Javie

try 
{ 
//try to do something there 
} 
catch (IOException e) 
{ 
//handle the exception 
e.printStackTrace(); 
} 

używam NetBeans IDE iz jakiegoś powodu printStackTrace jest podkreślony w falowane linii. Kiedy wciskam Alt + Enter, mówi się, że Throwable.printStackTrace() powinien zostać usunięty. Co to znaczy? Czy ktokolwiek mógłby dać lepszy wgląd w to, co to może oznaczać? Czy mogę to zignorować?

Dzięki!

Odpowiedz

20

To tylko zalecenie. W przypadku zaćmienia wszystko jest w porządku - uważam, że tylko IDE mówi, że istnieją bardziej konwencjonalne metody robienia tego, jak niektóre inne odpowiedzi. Uważam, że jest to przydatne do debugowania, i że powinieneś poinformować użytkowników, gdy wystąpi błąd krytyczny, aby użyć trybu debugowania (takiego jak konsola switch -d) do zbierania tych dzienników.

+0

przy użyciu struktury logowania, takiej jak log4j, jest jedną z lepszych metod. – svarog

36

Spróbuj:

e.printStackTrace(System.out); 
+0

Ah, dzięki @Pablo! Crazy, dlaczego to powoduje, że ostrzeżenie znika dokładnie? Jeśli nie określisz parametru 'System.out' jako parametru i pozostawisz go pustym, czy JVM przyjmie swoje polecenie trybu debugowania i wyświetli tylko konsolę? –

+6

Hack! To naprawdę nie rozwiązuje problemu tak bardzo, jak po prostu zatrzymuje go Netbeans. To będzie nadal wyświetlać domyślny strumień błędów. – ThePerson

+0

@ThePerson 'System.err' wyświetli domyślny strumień błędów, a nie' System.out'. 'System.out' reprezentuje domyślny strumień wyjściowy. – cst1992

14

To pewnie dlatego, że tak naprawdę nie printStackTrace() obsługi błędu tak bardzo jak to tylko zrzuca stos w konsoli. Działa jak symbol zastępczy, dopóki nie zastąpisz go odpowiednią obsługą błędów (jeśli w ogóle jest potrzebny) i zastąpisz wyjście jakimś rejestratorem.

9

e.printStackTrace();

Nie jest dobrą praktyką, ponieważ drukuje w domyślnym ErrorStream, który najczęściej jest konsolą!

NetBeans powinien was o tym ostrzegać. Dobrą praktyką jest rejestrowanie wiadomości. Śledź samego odniesienia:

http://onjava.com/pub/a/onjava/2003/11/19/exceptions.html

EDIT Zobacz pierwszy komentarz miech więcej informacji.

+6

Nie, drukuje do domyślnego strumienia błędów, który jest oddzielnym strumieniem, alias FileDescriptor, i może zostać przekierowany do osobnego pliku: 'java YourClass 1> plik.out 2> file.err' - e.printStackTrace drukuje na ' file.err ', a nie "file.out". –

+2

Nie zawsze jest to dobra praktyka. Ta konsola może być konsolą na serwerze sieciowym, do którego nie masz dostępu. Czasami lepiej jest umieścić ślad stosu również w bieżącym dzienniku aplikacji, szczególnie w aplikacjach internetowych. –

1

Wystarczy wydrukować ślad stosu nie wystarczy. Drukowanie śladu stosu wyjątku samo w sobie nie oznacza, że ​​jest to całkowicie zła praktyka, ale drukowanie tylko śledzenia stosu, gdy wystąpi wyjątek, jest problemem.

Zawsze rejestruj wyjątki (używając dobrego logging framework), ale nie wystawiaj ich na działanie użytkownikowi końcowemu. I upewnij się, że pokazujące ślady stosu tylko w trybie deweloperskim.

Sam używam (przez większość czasu) logger.log(Level.SEVERE, <exception>.getMessage(), <exception>);.

kiedy netbeans proponujemy, aby obsłużyć wyjątek 'Surround Statement with try-catch', jeśli klikniesz na ten temat, to będzie generować):

try { 
    //something need to be handle(exception that throw) 
} catch (SQLException ex) { 
    Logger.getLogger(ClassName.class.getName()).log(Level.SEVERE, null, ex); 
} 

Który jest lepszy niż ex.printStackTrace();.

Mogą pomóc:

0
e.printStackTrace(System.err); 

pracował dla mnie