W Javie chcę zrobić coś takiego:
try {
...
} catch (/* code to catch IllegalArgumentException, SecurityException,
IllegalAccessException, and NoSuchFieldException at the same time */) {
someCode();
}
...zamiast:
try {
...
} catch (IllegalArgumentException e) {
someCode();
} catch (SecurityException e) {
someCode();
} catch (IllegalAccessException e) {
someCode();
} catch (NoSuchFieldException e) {
someCode();
}
Czy jest na to sposób?
java
exception
try-catch
multi-catch
froadie
źródło
źródło
bitwise or
(|
)? Dlaczego nie użyć przecinka lub operatora, który ma bardziej podobne znaczenie,logical or
(||
)?Nie dokładnie przed Javą 7, ale zrobiłbym coś takiego:
Java 6 i wcześniejsze
Java 7
źródło
exc.getCause()
. Na marginesie, Robert C. Martin (między innymi) zaleca stosowanie niezaznaczonych wyjątków (kompilator nie ma pojęcia, jakiego rodzaju wyjątek zostanie z tego wyrzucony); zapoznaj się z rozdziałem 7: Obsługa błędów w jego książce Wyczyść kod .throw exc
Zamiastthrow new RuntimeException(exc)
?W Javie 7 możesz zdefiniować wiele klauzul catch, takich jak:
źródło
Jeśli istnieje hierarchia wyjątków, można użyć klasy bazowej do przechwycenia wszystkich podklas wyjątków. W zdegenerowanym przypadku możesz przechwycić wszystkie wyjątki Java za pomocą:
W bardziej powszechnym przypadku, jeśli RepositoryException jest klasą bazową, a PathNotFoundException jest klasą pochodną, to:
Powyższy kod przechwytuje wyjątek RepositoryException i PathNotFoundException dla jednego rodzaju obsługi wyjątków, a wszystkie pozostałe wyjątki są grupowane. Od wersji Java 7, zgodnie z odpowiedzią @ OscarRyz powyżej:
źródło
Nie, jeden na klienta.
Możesz złapać nadklasę, taką jak java.lang.Exception, pod warunkiem, że we wszystkich przypadkach podejmiesz tę samą akcję.
Ale to może nie być najlepsza praktyka. Powinieneś wychwycić wyjątek tylko wtedy, gdy masz strategię faktycznego obchodzenia się z nim - a rejestrowanie i ponowne zgłaszanie nie oznacza „obsługi”. Jeśli nie masz działania naprawczego, lepiej dodaj go do podpisu metody i pozwól, aby pojawił się bąbelek dla kogoś, kto poradzi sobie z sytuacją.
źródło
Czystszą (ale mniej gadatliwą i być może nie tak preferowaną) alternatywą dla odpowiedzi user454322 na Javie 6 (tj. Na Androidzie) byłoby złapanie wszystkich
Exception
s i powtórne rzutowanieRuntimeException
. Nie działałoby to, jeśli planujesz wychwytywać inne typy wyjątków w dalszej części stosu (chyba że je również przerzucisz ponownie), ale skutecznie złapie wszystkie sprawdzone wyjątki.Na przykład:
Biorąc to pod uwagę, dla szczegółowości najlepiej byłoby ustawić wartość logiczną lub inną zmienną i na podstawie tego wykonać jakiś kod po bloku try-catch.
źródło
W wersji wcześniejszej niż 7:
źródło
caught
wfinally
bloku?Tak. Oto sposób użycia separatora pipe (|),
źródło
W przypadku kotlina nie jest to na razie możliwe, ale rozważali możliwość dodania go: Źródło.
Na razie tylko mała sztuczka:
źródło
Złap wyjątek, który przypadkowo jest klasą nadrzędną w hierarchii wyjątków. To oczywiście zła praktyka . W twoim przypadku częstym wyjątkiem nadrzędnym jest klasa Exception, a wyłapanie dowolnego wyjątku, który jest wystąpieniem wyjątku, jest rzeczywiście złą praktyką - wyjątki takie jak NullPointerException są zwykle błędami programowymi i zwykle powinny zostać rozwiązane poprzez sprawdzenie wartości zerowych.
źródło