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




To może ja nieco dodam od siebie... Pracowałem trochę z C++, trochę z Javą, a obecnie głównie z PHP. Jako że od C zaczynałem to mam podejście mocno zbieżne z tym co pisze darko. Wyjątki tylko dla sytuacji wyjątkowych. A czym one są? Otóż zachodzą one w momencie gdy poprawnie napisana aplikacja natrafia na sytuację, która od niej zupełnie nie zależy. Przykład? Utrata połączenia z bazą danych już po jego ustanowieniu. Wyjątkiem nie jest natomiast sytuacja powszechna jak pomyłka i z dużą dozą przewidywalna. Zapewne jednak każdy dopasowuje kryterium "wyjątkowości" do siebie.

Dla mnie jeśli userowi napisałem, że pole pomieścić może 15 znaków do których należą same litery polskiego alfabetu (przykładowo imię) to wpisanie tam dłuższego lub z cyframi oznacza, że albo się pomylił, albo jest debilem (IMG:style_emoticons/default/smile.gif) Tak czy inaczej nie jest to sytuacja wyjątkowa i mogę zwyczajnie upomnieć usera oraz poprosić o poprawne dane raz jeszcze, nie dopuszczając do dalszej części aplikacji lub celowo ignorując błędne dane (jeśli mogę, gdy są nieobowiązkowe) i informując o fakcie, iż nie wezmą one udziału w dalszej fazie obróbki danych. Jeśli natomiast dane są prawidłowe, a mimo to nie mogę dalej pracować, to jest to już sytuacja wyjątkowa. Przykład? Plik istnieje, dane są ok, użytkownik ma prawo do pliku (wgrał go na serwer i jest powiązany z plikiem), ale... fizycznie są ustawione błędne prawa dostępu (ktoś skopał chmod kopiując pliki podczas przywracania backupu). Inny przykład? Użytkownik i aplikacja mają zezwolenie na wgrywanie określonego typu plików na serwer... ale ustawienia danego hostingu ten akurat format uznają za niebezpieczny. Czyli dochodzi do sytuacji, gdy wszelkie pozwolenia są ok, plik JEST na serwerze, ale ustawienia sprawiają, że odgórnie serwer nas i aplikację zlewa, nie dopuszczając do w pełni akceptowalnego typu danych. Sam miałem z takimi do czynienia.

Najłatwiej więc to widać w sytuacji dostępu do zewnętrznego zasobu. Nie każda niemożność jest wyjątkowa. Jeśli zasobu od początku nie ma to trudno mówić by był to wyjątek. Po prostu nie ma go od samego początku i aplikacja zostanie zatrzymana już na starcie obróbki z powiadomieniem, że: "sorry batory, ale dalej się nie ruszę, nawet ciągnięta". Przykład? Obróbka pliku. Skoro oczekujemy tylko txt z określonym formatowaniem to tylko taki akceptujemy i każde odstępstwo nie jest wyjątkiem, ale błędnym typem danych i musimy zatrzymać proces obróbki do czasu poprawienia danych. Jeśli natomiast plik jest poprawny, ale w wyniku obróbki została wyczerpana pamięć dostępna to jest to coś niezależnego od samej aplikacji, mimo jej oraz danych poprawności.

Nie podzielam opinii Orzeszkka co do tego, że wszystko co jest odstępstwem od zamierzonego działania jest jednocześnie sytuacją wyjątkową. Gdyby tak było, w kodzie nie byłoby ŻADNEGO if-else, a jedynie same try-catch. No bo skoro ciąg zdarzeniowy jest liniowy to nawet celowe rozgałęzienie kodu jest sytuacją wyjątkową, czyż nie? Jednak wiele z typowych sytuacji w procesie działania aplikacji, które kończą się błędami, wynika z ograniczonej liczby przewidywalnych łatwo pomyłek lub prób wpłynięcia na wynik poprzez preparowanie danych. Przytoczono przykład z datą... Skoro wyraźnie zaznaczam, że akceptuję tylko daty z podanego zakresu o określonym formacie to wszystko inne jest błędnymi danymi, ale w pełni wychwytywalnymi. Nie jest to nic specjalnego.

Crozin... Zasugerowałeś, że try-catch powinno eliminować struktury kontrolne, gdzie ich wystąpienie jest wątpliwe i masz rację. Problemem jest jednak sytuacja, gdy programiści zaczynają wyjątki traktować jako alternatywną formę struktur kontrolnych. A takie coś sugeruje Orzeszekk. Jeśli domyślnie obsługujemy coś w jednakowy sposób, to każde odstępstwo = wyjątek. Innymi słowy dochodzimy do sytuacji, gdzie zamiast kilku if(-elseif)-else mamy dokładnie tyle samo bloków try-catch, których cel istnienia jest identyczny, ale robią to w, rzekomo, ładniejszy i łatwiejszy do ogarnięcia sposób. W ten sposób dochodzimy do takich aplikacji, gdzie cały kod to pierdylion try-catchy rzucających jeszcze więcej wyjątków do obsłużenia tak pozagnieżdżanych, że czytelność i konserwacja tegoż cierpią strasznie. A czemu? Bo programiście uwidziało się stworzyć strukturę wyjątków taką że hej i teraz musi jakoś to poodbierać, a że wyjątki dziedziczą jakoś po sobie, to tylko jeden, od którego dziedziczą inne złapie wszystkie naraz. Zaś przy bardziej szczegółowym trzeba łapać bardziej wyspecjalizowanymi (a więc odpowiedzialnymi za "gałęzie" wyjątków), czyli niejako wracamy do if-else, tylko że zbudowanego na wyjątkach. Sens tego żaden.
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 - 16:26