Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wyjątki, czyli kiedy je stosujemy?
podgur
post
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 1
Dołączył: 6.04.2009

Ostrzeżenie: (0%)
-----


Witam. Chciałem się dowiedzieć, kiedy NALEŻY stosować wyjątki w OOP? Chodzi mi o konkretne przykłady i jakieś dobre wytłumaczenie.
Wyjątki jak sama nazwa wskazuje, ale np .

Kod
$a=5;
$b=0;

if($a<$5){

...
}

Też mogli byśmy użyć wyjątków? i czy powinno się?

bless
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Czym dla mnie się różnią? Wyjątek i błąd to dla mnie nieco inne pojęcia. Wyjątek jest właściwie "podzbiorem" błędów, które nie są przez programistę przewidziane lub przewidywalne. W tej sytuacji więc, gdy mamy kontrolę danych dostarczonych przez usera wyjątki powinny być łapane dla całego obiektu gdyby coś jednak nie wyszło, ale błędy przewidywalne tylko komunikowane i odsługiwane przez programistę bez stosowania tego mechanizmu. Nie zaś, że rzucamy sobie wyjątek gdy user wprowadza nie pasujące do wzorca dane. To już jest bowiem kontrola przepływu danych i tutaj if-else w zupełności wystarcza.

Co do przykładu z zasobem to kwestia jest związana z sytuacją w jakiej to następuje. Jeśli aplikacja bazuje na połączeniu z zasobem i tym samym jest on integralną częścią, to jest to błąd i aplikacja powinna poinformować o tym fakcie gdy próbuje nawiązać połączenie i nie potrafi. Jeśli jednak aplikacja wie, że taki zasób jest i połączenie z nim ma, a w pewnym momencie nagle je traci to jest to już sytuacja wyjątkowa. W pierwszym bowiem wypadku już od samego początku wiemy, że zasób jest niedostępny i nie możemy z nim pracować. W drugim zasób jest i nagle znika. Pierwsze jest normą, gdyż możesz przewidzieć dokładnie wystąpienie błędu i jego miejsce. Tego nie można nazwać wyjątkiem. Ale jak przewidzisz wystąpienie drugiej sytuacji, która może mieć miejsce dokładnie w dowolnym momencie począwszy od momentu nawiązania połączenia do czasu jego zakończenia? Nie da się wprost powiedzieć: "To nastąpi w 5 sekund od nawiązania połączenia.", ale w wyniku debugu możemy określić przyczyny lub okoliczności wystąpienia, a tym samym możemy wyeliminować jej zajście i sprawić, że przestaje być wyjątkowa (IMG:style_emoticons/default/wink.gif)

Stwierdzasz, że albo rzucamy wyjątek albo zdajemy się na programistę... Czyli jako programista mogę mogę nie przejmować się błędem i jego obsługą tylko rzucam wyjątek i niech martwi się o to ten, który ów kod dołącza do aplikacji? Popatrz może dokładniej na kody Javowców i innych programistów. Tam jest wiele struktur kontrolnych, które powstają w momencie wykrycia nieprawidłowości poprzez wyjątek, a same wyjątki służą tylko wyłapywaniu nieprzewidzianych sytuacji, a nie by sterować.

To z czym się nie zgadzam w tym co napisałeś to fakt czego nie napisałeś. Dla mnie pełniejsza wersja to: "Wyjątki są od obsługi błędów, których miejsca i czasu wystąpienia nie potrafimy określić w chwili tworzenia aplikacji".

Przykład z różnicą między błędami jest prosty i zależy od... złożoności aplikacji. Czemu? Jeśli nie mamy w kodzie możliwości sprawdzenia poprawności danych to sprawdzenie czy plik jest uszkodzony jest dla nas niewychwytywalne. W takim wypadku gdy podczas pracy natrafimy na uszkodzony fragment zachodzi sytuacja wyjątkowa. Jeśli jednak kod sprawdzić potrafi możliwość wystąpienia uszkodzenia, to olanie tego przez programistę jest jego błędem i powinno to być wychwycone na etapie testowania oraz poprawione.

Dlatego Twoje 3 punkty (właściwie to 2 pierwsze, bo trzeci jest jak najbardziej prawidłowy) nieco skoryguję:
1. Wyjątki służą do obsługi błędów, które nie są przez programistę przewidziane lub przewidywalne. Poznając okoliczności zaistnienia, wyjątek staje się błędem zwykłym i zdolnym do wyeliminowania w 99% wypadków. Pozostały 1% jest zależny od środowiska uruchomieniowego i wpływu procesów zewnętrznych na samą aplikację lub powiązane z nią zasoby. Tym samym jest nieprzewidywalny z samej swojej natury i w zasadzie nigdy nie można go wyeliminować.
2. Wyjątki wyrzuca się gdy dany kod nie może zakończyć pracy pomyślnie ze względu na czynniki, które są poza zasięgiem i przewidywaniami specyfikacji. Tak więc mając jakąś metodę typu isValid(), którą jesteśmy w stanie wykryć istnienie błędu, wyjątki są techniką zbędną. Wywalimy wyjątek gdy coś jest niepoprawne, choć z przebiegu całości procesu nie da się wywnioskować chwili jego zaistnienia i powinno się dostać prawidłowe wyniki, co jednak nie zachodzi lub dochodzimy do sytuacji nietypowej dla aplikacji.
3. Wyjątki i tzw. struktury kontrolne mogą ze sobą bez problemu współgrać.
Go to the top of the page
+Quote Post

Posty w temacie
- podgur   Wyjątki, czyli kiedy je stosujemy?   30.03.2010, 21:23:32
- - zend   [PHP] pobierz, plaintext function getDb() ...   30.03.2010, 21:38:56
- - podgur   No tak, ale czy zamiast Kodfunction getDb(...   30.03.2010, 21:49:52
- - Zyx   Wyjątki nie należą do programowania obiektowego. W...   30.03.2010, 22:17:23
- - podgur   Wiem że nie należy, ale zazwyczaj używa się ich w ...   31.03.2010, 07:22:42
- - nospor   To zrob eksperyment: raz uzywaj zwyklych IF a raz ...   31.03.2010, 07:38:07
- - thek   Jak sama nazwa mówi, wyjątki powinno się stosować ...   31.03.2010, 09:19:32
- - podgur   W przypadku np. połączenia z baza danych i połącze...   31.03.2010, 09:22:58
- - zend   Tak, błąd przy wprowadzaniu danych od użytkownika ...   31.03.2010, 15:38:48
|- - Orzeszekk   Cytat(zend @ 31.03.2010, 15:38:48 ) T...   31.10.2011, 11:37:42
- - podgur   zend dziękuje:) Posłucham się i poćwiczę Pozdrawi...   1.04.2010, 22:18:07
- - Crozin   Po co jakieś ImageException, które jedyne co robi ...   2.04.2010, 00:05:27
- - podgur   Zaraz pozmieniam:) dzięki. Jeżeli ktoś ma jeszcze ...   2.04.2010, 08:40:38
- - mg2   Postanowiłem mój pierwszy post, napisać właśnie w ...   19.02.2011, 23:45:47
- - fifi209   "Standardowo" PDO rzuca wyjątkami z tego...   20.02.2011, 00:20:13
- - darko   Podobnie, jak cała biblioteka standardowa php. htt...   20.02.2011, 00:23:17
- - darko   ~Orzeszekk walidacja danych pochodzących od użytko...   31.10.2011, 11:57:23
- - Orzeszekk   OK, nie rozumiem nadal ja jako autor kodu przewid...   31.10.2011, 14:25:07
- - darko   Cytat(Orzeszekk @ 31.10.2011, 14:25:0...   31.10.2011, 14:52:54
- - Crozin   @darko: Błędne dane pochodzące z żądania HTTP są t...   31.10.2011, 15:27:42
- - Orzeszekk   Darko to ze wyjątki służą do sterowania aplikacją ...   31.10.2011, 15:42:51
- - darko   ~Orzeszekk To, że nie jest to sytuacja wyjątkowa,...   31.10.2011, 16:03:17
|- - Orzeszekk   Cytat(darko @ 31.10.2011, 16:03:17 ) ...   31.10.2011, 21:52:32
|- - darko   Post scriptum Cytat(Orzeszekk @ 31.10.2011, 2...   1.11.2011, 01:50:44
- - Crozin   @darko: A masz jakiś pomysł jak zareagować na sytu...   31.10.2011, 16:17:59
|- - darko   Cytat(Crozin @ 31.10.2011, 16:17:59 )...   31.10.2011, 18:21:25
- - Crozin   CytatDokładnie, dlatego najczęściej obejmuję bloki...   31.10.2011, 20:46:54
- - darko   <PASS> oho ~thek coś pisze   1.11.2011, 01:19:53
- - thek   To może ja nieco dodam od siebie... Pracowałem tro...   1.11.2011, 01:24:03
- - thek   @Crozin: sytuacja z jpg i jego formatem jest troch...   1.11.2011, 02:19:32
- - batman   Pozwolę sobie wtrącić się to tej jakże niezwykle i...   1.11.2011, 02:43:37
- - Crozin   CytatPrzykład? Plik istnieje, dane są ok, użytkown...   1.11.2011, 02:59:56
- - thek   Czym dla mnie się różnią? Wyjątek i błąd to dla mn...   1.11.2011, 14:23:09
- - Orzeszekk   Crozin jako chyba jedyna osoba z dyskutujących zac...   1.11.2011, 14:26:25
- - thek   A co do przykładu z dwoma formami zgłaszania błędó...   1.11.2011, 14:34:19
- - Orzeszekk   Są porównywalne, mozesz kompletnie zastąpić wyjąte...   1.11.2011, 14:42:15
- - Crozin   @thek: Taka osobista uwaga. Staraj się jednak pisa...   1.11.2011, 16:17:28
- - thek   @Orzeszek: Nie widzę problemu by wyjątki były wewn...   1.11.2011, 16:22:40
- - Crozin   [JAVA] pobierz, plaintext catch (SomeException...   1.11.2011, 17:15:41
- - batman   Cytat(thek @ 1.11.2011, 16:22:40 ) Ma...   1.11.2011, 17:44:03
- - thek   @Crozin: to o czym piszesz to ułomność języka, któ...   2.11.2011, 00:29:28
- - batman   CytatJednocześnie jeśli w owym (owych) XML dostani...   2.11.2011, 08:10:50
- - thek   Właśnie dlatego napisałem, nie "wyjatek...   2.11.2011, 09:46:27


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 2.10.2025 - 12:35