Jak mogę złapać wszystkie wyjątki, które zostaną wyrzucone podczas czytania i pisania pliku?

105

Czy w Javie istnieje sposób na pobranie (złapanie) wszystkich exceptionszamiast przechwytywania wyjątku indywidualnie?

Johanna
źródło
2
i złapię wszystkie te specyficzne wyjątki z catch (Exception e) {} ??
Johanna
Tak. Ponieważ Exception jest klasą bazową wszystkich wyjątków, przechwyci każdy wyjątek.
jjnguy
1
@ jjnguy: dzięki za dobre wyjaśnienie.
Johanna
Cieszę się, że to było pomocne.
jjnguy

Odpowiedzi:

111

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ć exceptionspóź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ć, exceptionsjeś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ć Exceptionssam 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 Exceptionjest 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 catchblok przed ogólnym wyjątkiem.

try{    
}catch(MyOwnException me){
}catch(Exception e){
}
jjnguy
źródło
95

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;
    }
}
codethulhu
źródło
12
Dlaczego nie użyć wielu bloków catch?
Carl G
1
Twierdziłbym, że każdy wyjątek należy wychwycić jawnie, ale pytanie wyraźnie dotyczy tego, jak wyłapać wszystko, co rzuci blok kodu.
codethulhu
Ten przedmiot do rzucania był przydatny.
Anshul
To jest rozwiązanie, którego szukałem, potrzebowałem innego rozwiązania do obsługi wyjątków. Dzięki
CubeJockey
Końcówka do rzucania jest naprawdę przydatna.
cherryhitech
15

Złap podstawowy wyjątek „Wyjątek”

   try { 
         //some code
   } catch (Exception e) {
        //catches exception and all subclasses 
   }
Allan
źródło
8
Jeśli piszesz ten kod, prawie na pewno robisz coś bardzo złego.
George
2
@George Dlaczego to powiedziałeś?
kuchi
10
@George Niekoniecznie, jeśli masz do czynienia z czymś, co ma wiele wrażliwych parametrów wejściowych i weryfikacja poprawności każdego z nich jest bardzo skomplikowana, najlepszym rozwiązaniem jest wychwytywanie wszelkiego rodzaju wyjątków po odpowiednim przetestowaniu przypadków roboczych . Sprawi, że kod będzie przejrzysty i znacznie mniej niepokojący niż ogromny i potencjalnie ciężki stan.
Johnride
2
Większość programistów Ja pracowałem z put nic w swoich wypowiedziach dotyczących połowów, więc za pomocą tego try catch fragment jest lepsza niż łapanie kilka różnych typów wyjątków i nie robi nic z nim
Lou morda
1
@LouisMorda Nie zgadzam się, przechwytywanie każdej podklasy wyjątków i nie robienie niczego na ich podstawie (ignorowanie ich) jest gorsze niż wyłapywanie określonych wyjątków i ignorowanie ich. Jeśli złapiesz niektóre typy wyjątków i nie zrobisz nic z informacjami, nie masz szansy wiedzieć, co poszło nie tak w takich sytuacjach, ale jeśli złapiesz wszystkie podklasy wyjątków, nie masz szansy wiedzieć, co poszło nie tak w dużej liczbie sytuacji. Zastanów się, jak poradzisz sobie z raportami błędów bez informacji z wyjątków, takich jak ślady stosu i komunikaty.
zpon
6

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ć.

Alex Feinman
źródło
1
Wyłapywanie wyjątków jest złą praktyką. czemu? głosowanie w dół źle wyjaśnione
Pedro Sequeira
4

Tak jest.

try
{
    //Read/write file
}catch(Exception ex)
{
    //catches all exceptions extended from Exception (which is everything)
}
CodeFusionMobile
źródło
4

Możesz złapać wiele wyjątków w jednym bloku catch.

try{
  // somecode throwing multiple exceptions;
} catch (Exception1 | Exception2 | Exception3 exception){
  // handle exception.
} 
Rathishkumar Nair
źródło
3

Czy masz na myśli złapanie Exceptiondowolnego 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...
}
JoshJordan
źródło
Co mam zrobić z tymi, które nie są konkretne?
Johanna
i złapię wszystkie te specyficzne wyjątki z catch (Exception e) {} ??
Johanna