Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP5]Wyjątki, kiedy je stosować
Forum PHP.pl > Forum > Przedszkole
Spykaj
Cześć, mam pytanie odnośnie wyjątków, czy można wyrzucić naraz więcej niż jeden ? :p np. jak jest powiedzmy rejestracja, to ja bym chciał, żeby naraz wyskoczyło 10 błędów, np:
- pole login jest niewypełnione
- pole hasło jest niewypełnione
- e-mail jest nieprawidłowy

itd, a z tego co zrozumiałem w wyjątkach, to wyrzucimy jeden i już koniec ;p no to lepiej już chyba normalnie przygotowywać tablicę z błędami -_-

hm, w ogóle jakoś nie widzę sensu stosowania tego cuda ;d powiedzcie, gdzie to można zastosować, żeby to naprawdę coś ułatwiło ;]
wipo
przykladowo zbierasz komunikaty o błędach i puszczasz dopiero jak komunikat jest pusty inaczej zwracasz bledy np:

  1. <?php
  2. $error='';
  3. if ($_POST['login']!='') $error.="Wpisz login\n";
  4. if ($_POST['pass']!='') $error.="Wpisz hasło\n";
  5. if ($error==''){
  6.  //wykonane poprawnie - brak błędów
  7. } else {
  8.  print $error;
  9.  //i pokazujesz formularz cos byl wczesniej
  10. }
  11. ?>
Cezar708
wg mnie nie do takich zastosowań służą wyjątki. Wyjątki to wyjątki, czyli mają jak najrzadziej występować i tylko w przypadku nieprawidłowego działania aplikacji, a nie użytkownika, bo na to aplikacja musi być przygotowana poprzez jakiś system walidacji.

Aplikacja powinna wyrzucać wyjątki na przykład w przypadku niemożliwości połączenia z bazą danych. W przypadku niemożności zaincludowania jakiejś klasy, a nie w przypadku, że użytkownik coś źle wpisał.

Odpowiadając na drugie pytanie.. to nie, nie można wywołać wielu wyjątków na raz... ale można wywoływać je kaskadowo, czyli zagnieżdżone wyjątki w catch() można wywoływać kolejne...

Pozdrawiam
scanner
Wyjątki możesz stosować zawsze, gdy przewidujesz, że może się wydarzyć jakieś zdarzenie, które zaburzy normalną pracę programu.
To co opisujesz, też się kwalifikuje do tej kategorii, jednak...
Wyjątki niosą ze sobą komunikaty. Czyli w Twoim przypadku, dobrze by było przygotować np.
  1. <?php
  2. class RejestracjaException extends Exception(){}
  3. ?>

i wyrzucać taki właśnie wyjątek.
W tym momencie możesz wyrzucić wyjątek nawet w formie:
  1. <?php
  2. throw new RejestracjaException( array( 'foo', 'bar' ) );
  3. ?>
a następnie poprzez
  1. <?php
  2. try{
  3. // blok weryfikacji
  4. } catch( RejestracjaException $e ){
  5. $aErrors = $e->getMessage();
  6. }
  7. ?>
wyciągnąć te tablicę.
Spykaj
Cezar708: no ale właśnie we wszystkich przykładach zastosowań wyjątków było sprawdzanie poprawności danych podanych przez użytkownika, najczęściej jest to tłumaczone na przykładzie funkcji podziel, jeden wyjątek to jak użytkownik poda w ogóle niepoprawne dane, a drugi jak dzielnik jest równy 0.

wipo: takie coś to ja już z powodzeniem stosuję :) próbuję się trochę przestawić na php5

scanner: aha -_- spróbuję to zrozumieć :] może to jest rozwiązanie
cbagov
Tak, niektorzy zastepowanie IF przez TRY/CATCH powinnni skonsultowac z lekarzem
Spykaj
Przesadzasz ;] w sumie to wpadłem na kilka pomysłów odnośnie tych wyjątków, można sporo w kodzie uprościć, np. czasem wyrzucać Exception a czasem FatalException, np. jak do bazy się nie można połączyć, to można Fatala wyrzucić, wtedy formularza wcale nie wyświetlać już więcej, albo brak uprawnień też fatal, a takie zapomnienie o jakimś polu to normalny wyjątek :]
lucassus
Cytat(scanner @ 22.06.2008, 11:59:51 ) *
np.
  1. <?php
  2. class RejestracjaException extends Exception(){}
  3. ?>

i wyrzucać taki właśnie wyjątek.
W tym momencie możesz wyrzucić wyjątek nawet w formie:
  1. <?php
  2. throw new RejestracjaException( array( 'foo', 'bar' ) );
  3. ?>


STOP, ludzie opamiętajcie się exclamation.gif

Wyjątki powinny służyć tylko i wyłącznie do obsługi wyjątkowych sytuacji (jak sama nazwa na to wskazuje). Sytuacja, gdy użytkownik podał błędny adres e-mail jest jak najbardziej normalnym stanem aplikacji. Z obsługą wyjątków związanych jest szereg kosztownych operacji np. zwijanie stosu.

Jeśli chodzi o kod do walidacji danych, to po co wymyślać koło na nowo. Wystarczy wziąć pierwszy lepszy framework, np. Zend Framework i komponent Zend_Validate, Zend_Filter.
scanner
A czy ja kogoś zmuszam, żeby akurat takiego mechanizmu użyć?
Jest to przykład, który można zastosować - nigdzie nie napisałem, że trzeba bo jest to jedyny i najlepszy sposób obsługi walidacji formularzy.

I akurat stopować tu nie ma czego, bo użycie w taki czy inny sposób wyjątków (czy innej dostępnej konstrukcji) jest bardziej podyktowane kontekstem kodu jaki powstaje.
Nie zabronisz przecież ~lucassus jakiemuś programiście używać ich, jeśli będzie to pasowało do konkretnej sytuacji.

Jak będę chciał, to nawet wyrzucę E_USER_WARNING jeśli tylko w odpowiedni sposób go wychwycę. Bo podanie błędnych danych rejestracyjnych (w tym przypadku) można uznać za wyjątek od poprawnej rejestracji. Lub za błąd użytkownika.

A może wspomniana rejestracja stanowi cześć jakiegoś API? Osobiście wolałbym dostać skonkretyzowany wyjątek na wyjściu niż true/false czy jakiś array i zastanawiać się, czy to jest array z błędami, czy z profilem usera.

I na koniec - nie traktujcie luźnych przykładów jako wykładni - bo nerwy Was zjedzą jak Hammiltona na dzisiejszym wyścigu F1 smile.gif

Edit:
~cbagov: Przedszkole od szkoły różni się tym, że czasami pozwala się malować dzieciom rękami - mimo, że nie jest to "klasyczny przez wszystkich uznany" sposób obsługi farb. Ale przedszkolanki się w takim wypadku nie wysyła do lekarza.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.