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
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@darko: A masz jakiś pomysł jak zareagować na sytuację nieprzewidzianą? No bo jeżeli wstawisz instrukcję warunkową i wyrzucisz wyjątek to jest to jak najbardziej "normalna", przewidziana sytuacja, co nie?

Cytat
Oprócz tego, co napisałeś czy nie jest tak, że wyjątki stosuje się wtedy, jeśli można przywrócić normalny stan aplikacji sprzed wystąpienia problemu (tj. po obsłużeniu błędu)?
Rzadko kiedy taka sytuacja ma miejsce. Z reguły wystąpienie błędu kończy się wymogiem jakiejś reakcji ze strony użytkownika i ewentualnym wznowieniu, a raczej ponownym uruchomieniu, danej akcji.

Cytat
Czy funkcja w php czytająca plik rzuci wyjątek czy zwróci false? Znowu wracamy do kwestii indywidualnej każdego z nas - tj. czy używać wyjątków do sterowania logiką aplikacji czy tylko w sytuacjach faktycznie wyjątkowych, gdzie zostawiamy wolne pole do obsługi napotkanego problemu?
Powinna bezsprzecznie wyrzucić wyjątek, co więcej powinien istnieć wymóg jawnej obsługi lub oddelegowania takiego wyjątku. Zwrócenie false jest paskudną i wyjątkowo podatną na błędy praktyką. Cały sens istnienia wyjątków to właśnie wyeliminowanie takiego zjawiska (o czym pisałem post wcześniej).

PS. Nie ma czegoś takiego jak "dane pochodzące od użytkownika traktowane w inny sposób". Dane od użytkownika to nic innego jak zewnętrzny zasób, którego format czy poprawność nigdy nie jest pewna.

Ten post edytował Crozin 31.10.2011, 16:20:22
Go to the top of the page
+Quote Post
darko
post
Post #3





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Cytat(Crozin @ 31.10.2011, 16:17:59 ) *
@darko: A masz jakiś pomysł jak zareagować na sytuację nieprzewidzianą? No bo jeżeli wstawisz instrukcję warunkową i wyrzucisz wyjątek to jest to jak najbardziej "normalna", przewidziana sytuacja, co nie?

Dokładnie, dlatego najczęściej obejmuję blokiem try {} catch {} kod, który nie jest mojego autorstwa i nie mogę przewidzieć, jak się zachowa, jak dostanie niepoprawne dane. Sprawdzam wtedy czy i jakie wyjątki wyrzuca i staram się obsłużyć wszelkie możliwe przypadki.

Cytat(Crozin @ 31.10.2011, 16:17:59 ) *
Rzadko kiedy taka sytuacja ma miejsce. Z reguły wystąpienie błędu kończy się wymogiem jakiejś reakcji ze strony użytkownika i ewentualnym wznowieniu, a raczej ponownym uruchomieniu, danej akcji.

Ok, ale jeśli nie ma możliwości wykonania żadnej akcji i z góry to wiadomo, to wyjątek nie ma racji bytu w takim miejscu. Bo niby po co? Chyba, że dalsze działanie aplikacji może wiele napsuć. To już jest wyjątkowa sytuacja (IMG:style_emoticons/default/smile.gif) W przeciwnym razie wystarczyłby zwykły komunikat będący efektem sprawdzenia (if - else). Natomiast inaczej sprawa wygląda, jeśli możemy "olać" pewien niedobór danych (czy niespełnienie kryterium), ale nie musimy i tutaj należy zostawić pole dla programisty, który będzie korzystał z naszego kodu - dać mu możliwość zadecydowania, co w takiej sytuacji zrobić? Może dla niego, w jego użyciu naszego kodu nie będzie to niezbędne? Staram się uchwycić faktyczne sytuacje, kiedy wyjątki są niezbędne.

Cytat(Crozin @ 31.10.2011, 16:17:59 ) *
Powinna bezsprzecznie wyrzucić wyjątek, co więcej powinien istnieć wymóg jawnej obsługi lub oddelegowania takiego wyjątku. Zwrócenie false jest paskudną i wyjątkowo podatną na błędy praktyką. Cały sens istnienia wyjątków to właśnie wyeliminowanie takiego zjawiska (o czym pisałem post wcześniej).

A jednak różnie bywa: file zwraca false, fopen również przy czym "If the open fails, an error of level E_WARNING is generated. You may use @ to suppress this warning." (- czy to jest eleganckie rozwiązanie? Nie.), file_get_contents - j.w., SplFileInfo::openFile generuje RuntimeException - ok.

Cytat(Crozin @ 31.10.2011, 16:17:59 ) *
PS. Nie ma czegoś takiego jak "dane pochodzące od użytkownika traktowane w inny sposób". Dane od użytkownika to nic innego jak zewnętrzny zasób, którego format czy poprawność nigdy nie jest pewna.

A czy nie jest tak, że niezależnie od tego, co przyjdzie od użytkownika, programista spodziewa się określonych danych w pewnym formacie o danej maksymalnej długości i typie? Czy to nie jest sytuacja przewidywalna? Według mnie jest i nie jest w żaden sposób wyjątkowa. Zamiast upychać wszędzie rozmaite podhierarchie wyjątków można pewne rzeczy wymusić, albo - po przeprowadzeniu walidacji - zwrócić komunikat(y) błędu/błędów i czekać na poprawienie danych przez użytkownika. Czy walidatory wyrzucają wyjątki? Nie. Dalej nie mam przekonania czy powinniśmy stosować wyjątki dla sytuacji przewidywalnych, dla których znamy z góry wymagane kryteria (przecież często sami je narzucamy) i oczekujemy określonego rezultatu czy też lepiej używać instrukcji warunkowych i wymuszać pewien stan rzeczy?

PS. kiedyś przyszło mi pracować z kodem, gdzie w każdym niepewnym miejscu autor po prostu zatrzymywał działanie skryptu poprzez die('coś tam'). Niestety nie mieliśmy zbyt dużo czasu, żeby zapoznać się z kodem i wyszedł z tego mega zonk. Z kolei z drugiej strony - zdarzyło mi się korzystać z biblioteki do obróbki grafiki (jakaś darmowa, nazwy nie pamiętam) - tu z kolei autor dla każdej bzdury rzucał wyjątkami na prawo i lewo, np. rozmiar obrazka był za duży lub z mały - throw new Exception('Obrazek ma niepoprawny rozmiar'); - i tyle. Ani słowa na temat czy rozmiar jest za mały czy za duży? Ogólnie chodzi o to, żeby korzystać z wyjątków z głową, stosując przy tym wcześniej dobrze przemyślaną hierarchię. Nie wystarczy po prostu korzystać z wyjątków. Powód każdego rzucanego wyjątku powinien być bardzo szybko "identyfikowalny", a komunikat jasny i czytelny. Pozostawiam indywidualnym preferencjom decyzję, kiedy i w jakich sytuacjach wykorzystywać wyjątki.

Ten post edytował darko 31.10.2011, 18:29:15
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: 4.10.2025 - 03:38