Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Exception w dwoch postaciach:)
kicaj
post
Post #1





Grupa: Zarejestrowani
Postów: 1 640
Pomógł: 28
Dołączył: 13.02.2003
Skąd: Międzyrzecz/Poznań

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


Zastanawiam sie jak rozwiazac problem z wyjatkami, otoz:
Tworze sobie pochodne klasy Exception:
MessageException (mniej powazne bledy)
FatalException (powazny blad zatrzymujacy dzialanie aplikacji)

MessageException chcialbym uzywac np. do problemow typu: Niepoprawne ID, Nie ma takiego rekordu w bazie, etc., a FatalException do sytuacji gdy np. nie ustanowiono poleczenia z db

  1. <?php
  2. class DB
  3. {
  4.  // laczy z baza, w razie niepowodzenia zwraca:
  5.  throw new FatalException( 'Niestety nie ustanowiono polaczenia z baza!' );
  6. }
  7.  
  8. class Users
  9. {
  10. function __construct( $iID )
  11. {
  12. if( !is_numeric( $iID ) )
  13. {
  14.  throw new MessageException( 'Niepoprawne ID' );
  15. }
  16. }
  17. ?>



  1. <?php
  2. $oDB = new DB; //laczenie
  3.  
  4. try
  5. {
  6. // wyswietlanie podstawowego widoku (header)
  7.  
  8. $oU = new Users( 'a' );
  9.  
  10. // wyswietlanie podstawowego widoku (footer)
  11. }
  12. catch( Exception $oE )
  13. {
  14. echo $oE -> printError();
  15. }
  16. ?>


Efektem tego ma byc ze jezeli nie polaczy sie z baza dostanie na ekranie tylko komunikat o bledzie (FatalException), zas jesli wystapi blad w klasie Users (MessageException) to wsywietlony zostanie szablon z komunikatem o bledzie (header, komunikat, footer)

Jak to rozwiazac?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
kicaj
post
Post #2





Grupa: Zarejestrowani
Postów: 1 640
Pomógł: 28
Dołączył: 13.02.2003
Skąd: Międzyrzecz/Poznań

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


No nie zabardzo splatch, ja widze to raczej tak (podzial na bledy i bledy krytyczne):
  1. <?php
  2. try
  3. {
  4. // szablon header
  5.  
  6. if( MessageException )
  7. {
  8. // szablon bledu maloznaczacego/ostrzezenia
  9. }
  10. else
  11. {
  12. // szablon wlasciwy wywlanej poprawnie akcji
  13. }
  14.  
  15. // szablon footer
  16. }
  17. catch( FatalException )
  18. {
  19. // tylko szablon bledu krytycznego, brak wyswietlania jakichkolwiek elementow stro
    ny
  20. }
  21. ?>


Jak widac pierwsza czesc bloku try wyswietla szablon calej strony z ostrzezeniem (np. nie podano id) lub zawartoscia akcji (wyswietlony user), zas druga czesc bloku zatrzymuje cala aplikacje i wyswietla komunikat o krytycznym bledzie (np. brak polaczenia z db)
Go to the top of the page
+Quote Post
splatch
post
Post #3





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

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


Cytat(kicaj @ 5.12.2007, 12:18:32 ) *
No nie zabardzo splatch, ja widze to raczej tak (podzial na bledy i bledy krytyczne):
  1. <?php
  2. try
  3. {
  4. // szablon header
  5.  
  6. if( MessageException )
  7. {
  8. // szablon bledu maloznaczacego/ostrzezenia
  9. }
  10. else
  11. {
  12. // szablon wlasciwy wywlanej poprawnie akcji
  13. }
  14.  
  15. // szablon footer
  16. }
  17. catch( FatalException )
  18. {
  19. // tylko szablon bledu krytycznego, brak wyswietlania jakichkolwiek elementow stro
    ny
  20. }
  21. ?>


Jak widac pierwsza czesc bloku try wyswietla szablon calej strony z ostrzezeniem (np. nie podano id) lub zawartoscia akcji (wyswietlony user), zas druga czesc bloku zatrzymuje cala aplikacje i wyswietla komunikat o krytycznym bledzie (np. brak polaczenia z db)


kicaj zanim zapniesz wyjątki do walidacji zastanów się kto powinien obsługiwać błędy walidacji bo sprawa obsługi błędów i walidacji to dwie różne rzeczy, no chyba że chcesz traktować błędy z inputu na równi z błędami systemowymi. W końcu możesz mieć FatalException przy połączeniu do bazy danych i FatalException przy walidacji, bo ktoś nie podał wartości w polu user_login. Z resztą walidację omawiamy już w oddzielnym temacie i sugestie z użyciem wyjątków do walidacji powinny trafiać tam, a nie tu, jak sądzę.
Myślenie o wyjątkach w dwóch kategoriach - krytyczne i "nie krytyczne" jest złe bo nie masz rozróżnienia na kontekst wystąpienia błędu i zawężasz sobie pole do ich obsługi. W końcu nie wszystkie FatalException-y obsługujesz tak samo. Obsługa wyjątków w try/catch przez instanceof jest prawdę powiedziawszy lekkim naginaniem zasad związanych z przeznaczeniem wyjątków i zastosowaniem bloku catch. Nie odbiega to od trigger_error zatem zastanów się czy piszesz obiektowo czy też bawisz się w przeplatanie.

Kwestia wyjątków w akcji - obsługujesz tylko te, które rzeczywiście musisz. W większości przypadków możesz wydelegować ich obsługę do FrontControllera i pozbyć się śmieci z logiki.
Go to the top of the page
+Quote Post

Posty w temacie


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: 7.10.2025 - 15:08