Czy w Javie istnieje sposób na pobranie (złapanie) wszystkich exceptions
zamiast przechwytywania wyjątku indywidualnie?
Czy w Javie istnieje sposób na pobranie (złapanie) wszystkich exceptions
zamiast przechwytywania wyjątku indywidualnie?
Odpowiedzi:
Jeśli chcesz, możesz dodać klauzule throws do swoich metod. Wtedy nie musisz od razu łapać sprawdzonych metod. W ten sposób możesz złapać exceptions
później (być może w tym samym czasie co inne exceptions
).
Kod wygląda następująco:
public void someMethode() throws SomeCheckedException {
// code
}
Później możesz sobie z nimi poradzić, exceptions
jeśli nie chcesz zajmować się nimi tą metodą.
Złapać wszystkie wyjątki jakiś fragment kodu może rzucać można zrobić: (To będzie także złapać Exceptions
sam napisałeś)
try {
// exceptional block of code ...
// ...
} catch (Exception e){
// Deal with e as you please.
//e may be any type of exception at all.
}
Powodem, który działa, jest to, że Exception
jest to klasa bazowa dla wszystkich wyjątków. Zatem każdy wyjątek, który może zostać wyrzucony, to Exception
(wielka litera „E”).
Jeśli chcesz najpierw obsłużyć własne wyjątki, po prostu dodaj catch
blok przed ogólnym wyjątkiem.
try{
}catch(MyOwnException me){
}catch(Exception e){
}
Chociaż zgadzam się, że przechwytywanie surowego wyjątku nie jest dobrym stylem, istnieją sposoby obsługi wyjątków, które zapewniają lepsze rejestrowanie i możliwość obsługi nieoczekiwanych. Ponieważ jesteś w wyjątkowym stanie, prawdopodobnie jesteś bardziej zainteresowany uzyskaniem dobrych informacji niż czasem odpowiedzi, więc wystąpienie wydajności nie powinno być wielkim hitem.
try{
// IO code
} catch (Exception e){
if(e instanceof IOException){
// handle this exception type
} else if (e instanceof AnotherExceptionType){
//handle this one
} else {
// We didn't expect this one. What could it be? Let's log it, and let it bubble up the hierarchy.
throw e;
}
}
Jednak nie bierze to pod uwagę faktu, że IO może również zgłaszać błędy. Błędy nie są wyjątkami. Błędy są w innej hierarchii dziedziczenia niż Wyjątki, chociaż oba mają wspólną klasę bazową Throwable. Ponieważ IO może rzucać błędy, możesz posunąć się nawet do złapania Throwable
try{
// IO code
} catch (Throwable t){
if(t instanceof Exception){
if(t instanceof IOException){
// handle this exception type
} else if (t instanceof AnotherExceptionType){
//handle this one
} else {
// We didn't expect this Exception. What could it be? Let's log it, and let it bubble up the hierarchy.
}
} else if (t instanceof Error){
if(t instanceof IOError){
// handle this Error
} else if (t instanceof AnotherError){
//handle different Error
} else {
// We didn't expect this Error. What could it be? Let's log it, and let it bubble up the hierarchy.
}
} else {
// This should never be reached, unless you have subclassed Throwable for your own purposes.
throw t;
}
}
Złap podstawowy wyjątek „Wyjątek”
try {
//some code
} catch (Exception e) {
//catches exception and all subclasses
}
Wyłapywanie wyjątków jest złą praktyką - jest po prostu zbyt szerokie i możesz przegapić coś takiego jak wyjątek NullPointerException we własnym kodzie.
W przypadku większości operacji na plikach wyjątek główny stanowi IOException . Zamiast tego lepiej to złapać.
Tak jest.
try
{
//Read/write file
}catch(Exception ex)
{
//catches all exceptions extended from Exception (which is everything)
}
Możesz złapać wiele wyjątków w jednym bloku catch.
try{
// somecode throwing multiple exceptions;
} catch (Exception1 | Exception2 | Exception3 exception){
// handle exception.
}
Czy masz na myśli złapanie Exception
dowolnego typu, który jest wyrzucony, a nie tylko określone Wyjątki?
W takim razie:
try {
//...file IO...
} catch(Exception e) {
//...do stuff with e, such as check its type or log it...
}