Czasami rozumiem
try {
} catch(Throwable e) {
}
I czasami
try {
} catch(Exception e) {
}
Jaka jest różnica?
Czasami rozumiem
try {
} catch(Throwable e) {
}
I czasami
try {
} catch(Exception e) {
}
Jaka jest różnica?
Odpowiedzi:
Łapanie Throwable
obejmuje elementy należące do podklasy Error
. Zasadniczo nie powinieneś tego robić, chyba że na najwyższym poziomie wątku „catch all”, w którym chcesz się zalogować lub w inny sposób obsłużyć absolutnie wszystko, co może pójść nie tak. Byłoby to bardziej typowe w aplikacjach typu framework (na przykład na serwerze aplikacji lub frameworku testującym), w których może on uruchamiać nieznany kod i nie powinien mieć na niego wpływu wszystko , co jest nie tak z tym kodem, jak to tylko możliwe.
throw new Throwable();
stoi na przeszkodzie, aby pisać , więc jest to jedyny sposób, aby naprawdę złapać wszystko.
Pierwsza łapie wszystkie podklasy Throwable
(w tym Exception
i Error
), druga łapie wszystkie podklasy Exception
.
Error
jest programowo niemożliwy do odzyskania w jakikolwiek sposób i zwykle nie można go złapać, z wyjątkiem celów rejestrowania (które przechodzą ponownie). Exception
jest programowo odzyskiwalny. Jego podklasa RuntimeException
wskazuje na błąd programowania i zwykle nie można go również złapać.
Error
i 2) O ile nie będzie logowania, możesz nigdy nie zostać powiadomiony o wystąpieniu OOM, co powoduje, że zastanawiasz się, dlaczego serwer zaczął zachowywać się „zabawnie”
programmatically unrecoverable
znaczy dokładnie? Czy jest tak poważny, że nie możemy w zasadzie wywołać ŻADNEJ metody Java po jej złapaniu (rejestrowanie itp.) Bez szansy na uzyskanie nieprzewidzianego zachowania z JVM?
Its subclass RuntimeException indicates a programming error
: Nie jestem pewien, czy zgadzam się z tym stwierdzeniem. Jeśli to prawda, oznacza to, że wszystkie oczekiwane wyjątki powinny być sprawdzone. Co się stanie, jeśli spodziewam się, że coś może zawieść i nie da się go odzyskać w mojej aplikacji, ale chcę przynajmniej rzucić znaczący wyjątek? Użycie sprawdzonego wyjątku w tym przypadku wydaje się bezużyteczne i tworzy kod bojlera.
Thowable
łapie naprawdę wszystko, nawet ThreadDeath, który jest domyślnie wyrzucany, aby zatrzymać wątek z obecnie przestarzałej Thread.stop()
metody. Więc łapiąc Throwable
możesz być pewien, że nigdy nie opuścisz bloku try, przynajmniej nie przechodząc przez blok catch, ale powinieneś być przygotowany na obsługę OutOfMemoryError
i InternalError
lub StackOverflowError
.
Łapanie Throwable
jest najbardziej przydatne w zewnętrznych pętlach serwerów, które delegują wszelkiego rodzaju żądania do kodu zewnętrznego, ale same mogą nigdy się nie kończyć, aby utrzymać usługę przy życiu.
Throwable
jest super klasy Exception
, jak również Error
. W normalnych przypadkach powinniśmy zawsze wyłapywać podklasy Exception
, aby pierwotna przyczyna się nie zgubiła.
Tylko specjalne przypadki, w których widzisz możliwość, że coś pójdzie nie tak, co nie kontroluje twojego kodu Java, powinieneś złapać Error
lub Throwable
.
Pamiętam, jak łapałem Throwable'a, by oznaczyć, że natywna biblioteka nie jest załadowana.
Widziałem, jak ludzie używają Throwable do wychwytywania błędów, które mogą się zdarzyć z powodu awarii / braku dostępu do sieci.