• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dlaczego rzucanie ogólnego wyjątku Exception przez metodę jest złą praktyką?

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
548 wizyt
pytanie zadane 15 września 2016 w Java przez rj45 Nowicjusz (120 p.)

Witam. Czy, może ktoś solidnie, z przykładem powiedzieć i udowodnić dlaczego rzucanie ogólnego wyjątku Exception w Javie jest złe i nie powinno się tego robić? Napisałem taki prosty kawałek kodu:

public class Point {

    public void m(int x) throws Exception{
	
	    if(x == 1) throw new IllegalAccessException();
	    else if (x == 2) throw new InstantiationException();
	    else if (x == 3) throw new CloneNotSupportedException();
	    else throw new NoSuchFieldException();

    }
    
    public static void main(String[] args){

	Point p1 = new Point();
	
	try{
	       
	    p1.m(1);
	       
	}
	catch(IllegalAccessException e){
	       
	    System.err.println(e);
	    System.err.println("ILLEGAL ACCESS");
	       
	}
	catch(InstantiationException e){
	       
	    System.err.println(e);
	    System.err.println("INSTANTIATION");
	       
	}
	 catch(CloneNotSupportedException e){
	       
	    System.err.println(e);
	    System.err.println("CLONE");
	       
	}
	catch(Exception e){
	       
	    System.err.println(e);
	    System.err.println("EXCEPTION");
	       
	   }
	   		   
    }
    
}

Przerzuciłem kiladziesiąt stron w poszukiwaniu odpowiedzi i być może jej nie rozumiem. Ludzie piszą na stacku, żę jeżeli metoda rzuca ogólny wyjątek, to niby nie jestem w stanie potem odróżnić jaki to był konkretny wyjątek, bo pakuje wszystko do ogólnego typu Exception. Jednak w kodzie który widać powyżej, jestem w stanie obsłużyć wszystkie 3 moje wyjątki (w zależności jaki sobie podam parametr do metody m() ), pozostałe zwyczaje będą obsługiwane przez ostatnią klauzulę catch(Exception e). Gdzie jest więc problem?

komentarz 15 września 2016 przez niezalogowany

link -> wyjaśnione w odnośnie PHP, ale problem ten sam (musisz trochę poscrollować) ;)

komentarz 15 września 2016 przez rj45 Nowicjusz (120 p.)

Czytałem to. Właściwie to jest napisane tylko tyle

Nie powinno się rzucać całkowicie generycznymi wyjątkami!

i nic to nowego nie wnosi. Jaka jest różnica między sygnaturą metody:

m() throws Exception{}

m() throws IllegalAccessException, InstantiationException, CloneNotSupportedException, NoSuchFieldException{}

Program w obu przypadkach działa tak samo i nie trace żadnych szczegółów na temat rzuconego wyjątku. 

komentarz 15 września 2016 przez niezalogowany
Jeżeli oznaczysz sobie tekstowo różne wyjątki, to dużo łatwiej zorientować się co szwankuje (np. wyświetla Ci się "Problem z API nr. XXX" a nie "XXX" - dużo wygodniejsze). Na pewno ma to też inne wyjaśnienia, ale tu będziesz musiał poczekać na autora wpisu, bo nie znam się na tyle żeby się wypowiadać ;)
komentarz 15 września 2016 przez Comandeer Guru (606,240 p.)

Właściwie to jest napisane tylko tyle

Szczerze? To chyba jednak nie czytałeś…

Napisałem tam cały długi akapit o tym, wraz z przykładem kodu. I jeśli z tego wyciągnąłeś jedynie pierwsze zdanie, no to cóż. 

2 odpowiedzi

+1 głos
odpowiedź 15 września 2016 przez Comandeer Guru (606,240 p.)

Pisałem o tym w kontekście kursu PHP:

Nie powinno się rzucać całkowicie generycznymi wyjątkami! Sam PHP ma sporo wbudowanych typów wyjątków. Już tylko ich używając można napisać bardzo sensowną obsługę błędów z rozróżnianiem ich typów. Obecnie przedstawiony kod błędnie zakłada, że wszystkie wyjątki dotyczą obsługi bazy danych. W przypadku stosowania konkretnych rodzajów wyjątków można konstruować nawet stopniową obsługę wyjątków:

try {
	// Dziwny kod
} catch ( NetException $e ) {
	echo 'Coś z netem';
} catch ( APIException $e ) {
	echo 'Coś z API';
} catch ( Exception $e ) {
	echo 'Coś, ale nie wiem co…';
}

W tego typu kodzie od razu widzimy jaki błąd dostajemy i możemy dzięki temu odpowiednio pokierować dalej działaniami aplikacji.

Dzięki temu zamiast np. kopać się z parsowaniem komunikatu z wyjątku, od razu po jego typie wiesz, co się dzieje i jak należy to obsłużyć. 

komentarz 15 września 2016 przez Comandeer Guru (606,240 p.)
Inny, być może jeszcze ważniejszy, powód to zgodność z SOLID. Tak szczegółowe wyjątki pełnią bowiem jedną, ściśle określoną funkcję – co wynika bezpośrednio z zasady Single Responsibility (Pojedynczej Odpowiedzialności).
komentarz 15 września 2016 przez Surykat Stary wyjadacz (14,780 p.)
Dodałbym jeszcze, że często podczas testowania jednostkowego, oczekujemy, że dane wywołanie funkcji zwróci jakiś konkretny wyjątek, w asercjach można to potem sprawdzić.

O ile jesteście zwolennikami takiego podejścia, są ponoć ludzie którzy piszą kod exception-safe i koniec. :)
0 głosów
odpowiedź 15 września 2016 przez ReksetoDev Gaduła (4,530 p.)
Odpowiedz znajdziesz w tym co tu napisze : Jesli tworzysz obiekt to czemu nie robic Object d = new Object() a tworzysz obiekt na podstawie klasy ktorej potrzebujesz tak samo tu lapiesz to co potrzebujesz

Podobne pytania

0 głosów
1 odpowiedź 552 wizyt
pytanie zadane 9 lipca 2019 w Java przez magicznyukf Początkujący (260 p.)
+1 głos
3 odpowiedzi 1,247 wizyt
pytanie zadane 27 sierpnia 2017 w Java przez Patryk Moros Początkujący (470 p.)
0 głosów
0 odpowiedzi 115 wizyt
pytanie zadane 25 marca 2019 w PHP przez Q_Nick Mądrala (5,010 p.)

93,195 zapytań

142,211 odpowiedzi

322,061 komentarzy

62,519 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 3316p. - dia-Chann
  2. 3251p. - Łukasz Piwowar
  3. 3243p. - Łukasz Eckert
  4. 3222p. - CC PL
  5. 3167p. - Tomasz Bielak
  6. 3157p. - Łukasz Siedlecki
  7. 3133p. - rucin93
  8. 3110p. - Maurycy W
  9. 3028p. - Adrian Wieprzkowicz
  10. 2992p. - Mikbac
  11. 2490p. - Marcin Putra
  12. 2481p. - Anonim 3619784
  13. 2467p. - Michał Telesz
  14. 2427p. - Michal Drewniak
  15. 1949p. - rafalszastok
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...