Istnieją 2 różne rodzaje wyjątków w Javie: zaznaczone i niezaznaczone. Istnieje wielka debata, nad którą lepiej się posługiwać, oba argumenty są dobre.
Zasadniczo wyjątek sprawdzany wywodzi się z java.lang.Exception
i wymaga, aby w przypadku, gdy nie określisz swojej metody jako "throws MyCheckedException", musisz przechwycić wyjątek w ramach metody i obsłużyć go.
// throw the exception
void foo() throws MyCheckedException
{
throw new MyCheckedException();
}
// or handle the exception
void foo()
{
try {
throw new MyCheckedException();
} catch (MyRuntimeException e) {
e.printStackTrace();
}
}
Niesprawdzony wyjątek, pochodzące z java.lang.RuntimeException
wymaga ani że określenie „rzuca” w definicji metody ani że go obsłużyć.
void foo()
{
throw new MyUncheckedException();
}
Zaletą sprawdzanego jest to, że kompilator wyświetli ostrzeżenie, gdy użytkownik nie zajmie się wyjątkiem.
Wadą jest to, że musisz zadeklarować blok try/catch lub throws dla każdego sprawdzanego wyjątku, a kod wyższego poziomu może być dość kłopotliwy, próbując obsłużyć wszystkie typy wyjątków.
Z tego powodu, jeśli jesteś ostrożny, możesz użyć opcji Niezaznaczone wyjątki.
BTW, możesz wybrać typ wyjątku tylko wtedy, gdy zdefiniujesz własny.
Po napotkaniu Wyjątków z Java lub biblioteki innej firmy, musisz zdecydować, jak sobie z tym poradzić. na przykład Jeśli metoda trzeciej strony zgłasza metodę CheckedException1, musisz albo ją obsłużyć, albo zadeklarować metodę wywołania jako "throws CheckedException1". Jeśli chcesz uniknąć używania Wyjątków zaznaczonych, możesz go opakować w Niezaznaczony wyjątek i wyrzucić.
void foo() // no throws declaration
{
try {
thirdPartyObj.thirdPartyMethod(); // this throws CheckedException1
}
catch (CheckedException1 e) {
throw new MyUncheckedException(e); // this will wrap the checked in an unchecked.
}
}
Pamiętaj, że możesz rzucić wyjątek Niezaznaczony bez deklaracji "rzutów". Aby uzyskać dostęp do oryginalnego obiektu CheckedException1 z wyższej kategorii, można użyć metody .getCause() wyjątku Unchecked.
void caller()
{
try {
foo();
} catch (MyUncheckedException e) {
CheckedException1 ce1 = e.getCause();
ce1.printStackTrace();
}
}
... ale dlatego, że wyjątek od foo() nie jest zaznaczona, nie mieć poradzić albo zadeklarować „wyrzuca”.
Odnośnie logowania, istnieją różne szkoły myślenia na ten temat.
- Zaloguj go, gdy wyjątek występuje (niski - poziom)
- Zaloguj się, gdy osiągnie górną (wysoki - poziom)
- Zaloguj się jeśli masz wystarczająco dużo informacji, aby odpowiednie działanie i/lub wiadomość dziennika. (średni poziom)
Dobrą polityką, którą znalazłem, jest zainstalowanie niezamkniętego sterownika wyjątków, który zajmie się wszystkimi nieprzypadkowymi (oczywiście niezaznaczonymi) wyjątkami. W ten sposób wszystko, co zostanie pominięte, będzie rejestrowane i potencjalnie obsługiwane przed awarią systemu.
public class MyExceptionHandler implements UncaughtExceptionHandler
{
@Override
public void uncaughtException(Thread thread, Throwable ex)
{
ex.printStackTrace();
}
}
// In your high-level code
Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler());
i wszystkie wyjątki, które mogą być obsługiwane z wdziękiem, złapać i obsługiwać je w module gdzie wiesz wystarczająco dużo o sytuacji ewentualnie skorygować problem i spróbuj ponownie.
Chociaż ta odpowiedź jest dokładna, poniższa odpowiedź Paiego jest znacznie bardziej pomocna. – Gowiem