Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP5]Wyjątki, kiedy je stosować, to takie genialne ??
Spykaj
post
Post #1





Grupa: Zarejestrowani
Postów: 104
Pomógł: 3
Dołączył: 30.05.2008
Skąd: Białystok

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


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 ;]


--------------------
?>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
wipo
post
Post #2





Grupa: Zarejestrowani
Postów: 856
Pomógł: 19
Dołączył: 30.08.2005
Skąd: 100lica

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


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. ?>


--------------------
Go to the top of the page
+Quote Post
Cezar708
post
Post #3





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

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


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
Go to the top of the page
+Quote Post
scanner
post
Post #4





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




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ę.


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
Spykaj
post
Post #5





Grupa: Zarejestrowani
Postów: 104
Pomógł: 3
Dołączył: 30.05.2008
Skąd: Białystok

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


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

Ten post edytował Spykaj 22.06.2008, 11:11:51


--------------------
?>
Go to the top of the page
+Quote Post
cbagov
post
Post #6





Grupa: Zarejestrowani
Postów: 181
Pomógł: 18
Dołączył: 19.04.2008

Ostrzeżenie: (10%)
X----


Tak, niektorzy zastepowanie IF przez TRY/CATCH powinnni skonsultowac z lekarzem
Go to the top of the page
+Quote Post
Spykaj
post
Post #7





Grupa: Zarejestrowani
Postów: 104
Pomógł: 3
Dołączył: 30.05.2008
Skąd: Białystok

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


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 :]


--------------------
?>
Go to the top of the page
+Quote Post
lucassus
post
Post #8





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 8.01.2008

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


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.
Go to the top of the page
+Quote Post
scanner
post
Post #9





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




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.


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.08.2025 - 07:30