Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php5] Exception i bloki try/catch
Forum PHP.pl > Forum > PHP > Object-oriented programming
jastu
Sama obsługa błędów jest dla mnie (jeśli dobrze rozumiem) jasna , problem polega na wykorzystaniu tej obsługi .

Są pliki z klasami - pliki php - pliki php wykorzystują klasy i wysyłają dane do szablonów ....

Generuję wyjątek w klasie np.DBusing bo nie można się połączyć.... ale w pliku php w kolejnej lini wysyłam zapytanie i dostaję kolejny wyjątek...hm...

Można dać to w blok try ale wtedy mam jeszcze większy bałagan z wyjątkami (jeśli powstała by tablica wyjątków to pierwszy pociągnął by za sobą kolejne a nie tak to być powinno ).

Jak pisać obługę błędów ?
dr_bonzo
  1. <?php
  2. try
  3. {
  4.  // laczysz sie z baza
  5. $db = new DBusing()
  6. $eb_>connect();
  7.  // zapytania
  8. $db->query(...)
  9. }
  10. catch ()
  11. {
  12.  ... obsluga
  13. }
  14. ?>


nie polaczy ci sie z baza -> wyjatek -> dalsze zapytania do bazy nie beda wykonywane


Przenosze z php na PHP5
jastu
tzn że w klasie nie budujemy wyjątków ? ewentualnie możemy robić IF`y sprawdzając ? ? ?

btw . jeśli mamy konstrukcję
  1. <?php
  2. try{
  3.  // polecenie 1
  4. try{
  5. // polecenie 2
  6. // polecenie 3
  7. }
  8. catch(Exc pol2){}
  9. catch(Exc pol3){}
  10. catch(Exc){}
  11. // polecenie 4
  12. }
  13. catch(Exc pol1){}
  14. catch(Exc pol4){}
  15. catch(Exc){}
  16. ?>


Jeśli dobrze rozumiem bład w 2 bloku try wygeneruje wyjątek ale plecenie 4 się wykona - co zrobić jeśli polecenie 4 korzysta z wyników operacji w poleceniu 2 i 3 , dać do jednego bloku 2 ,3 i 4 ?


//edit
polecenie numer 4 wygeneruje wyjątek ... a co z wyjątkami w klasach ? nie korzystamy ?

btw. co zrobić by w każdym pliku nie korzystac z funkcji set_error(exception)_handler() ?
hwao
Eh, zbytnio kombinujesz...

Exception jest tylko wyrzucany wtedy, gdy nie możliwe jest wykonanie jakiegoś algorytmu z przyczyn technicznych. Po to się stosuje wyjątki w celu wyeliminowania if'ów w ważnych częściach programu, gdyż są nie wygodne i nie niosą że sobą jakiejś informacji.
jastu
//edycja

W klasach generuemy błędy (przez throw) a w pliku łapiemy przez catch...ot cała filozofia...

Jak przechwycić błędy których nie przewidzimy ?
cicik
Cytat(jastu @ 27.11.2006, 15:45:58 ) *
Jak przechwycić błędy których nie przewidzimy ?


  1. <?php
  2. try {
  3. caly skrypt
  4. }
  5. catch(Exception) { }
  6. ?>
JaRoPHP
Cytat(hwao @ 27.11.2006, 15:40:22 ) *
Eh, zbytnio kombinujesz...

Całkowicie się zgadzam. Wyjątki (jak sama nazwa wskazuje) służą do obsługi sytuacji wyjątkowych. Niestety można zauważyć, że często konstrukcja ta jest wykorzystywana bezmyślnie (np. zamiast klauzul if).
batman
Wyjątki w PHP5 stanowią bardzo dobrą alternatywę do wszędobylskich if-ów, które tylko zaśmiecają kod. Możesz stworzyć własne klasy wyjątków, które rozszerzają klasę Exception. Następnie w miejscu, gdzie wykonujesz jakiś kod, który może wygenerować używasz try{ ... } catch(TwojWyjatek $e) { ... }
cicik
Cytat(JaRoPHP @ 1.12.2006, 22:38:23 ) *
Całkowicie się zgadzam. Wyjątki (jak sama nazwa wskazuje) służą do obsługi sytuacji wyjątkowych. Niestety można zauważyć, że często konstrukcja ta jest wykorzystywana bezmyślnie (np. zamiast klauzul if).


Nie zgadzam się z tobą.
Wyjątki często służą do wychodzenia z zagnieżdżonych wywołań funkcji, gdzie nie ma odpowiednika składni break, albo jego użycie wiązało by się z dużym kłopotem.
np:

  1. <?php
  2. try {
  3. for($i=0; $i < 10; $i++) {
  4. for($j=0; $j < 10; $j++) {
  5. for($k=0; $k < 10; $k++)
  6. funkcja();
  7. }
  8. }
  9. }
  10. catch(Exception $e) { }
  11.  
  12. function funkcja() {
  13. $j = 0
  14. while($j++ < 20) {
  15.  if(jakis_warunek)
  16.  throw new Exception;
  17. }
  18. }
  19. ?>
dzesi
Witam czy byście mogli mi przybliżyć bardziej bloki try i catch bo nierozumiem jak je zastosowac i podać przykład ? ,bardzo dziekuje za pomoc :roll2: worriedsmiley.gif
ActivePlayer
http://pl.php.net/exceptions
Sabistik
~dzesi zapraszam do wortalu: http://wortal.php.pl/wortal/artykuly/proce...likacji/wyjatki
JaRoPHP
Cytat(cicik @ 3.12.2006, 17:08:04 ) *
Nie zgadzam się z tobą.
Wyjątki często służą do wychodzenia z zagnieżdżonych wywołań funkcji, gdzie nie ma odpowiednika składni break, albo jego użycie wiązało by się z dużym kłopotem.

Wyjątki są rozwiązaniem wygodnym, ale zostały stworzone do sytuacji wyjątkowych... Z definicji nie służą do "wychodzenia z zagnieżdżonych wywołań funkcji".
Cytat
Wyjątek to sygnał o błędzie w trakcie wykonania programu. Powstaje [wyjątek] na skutek nieoczekiwanego błędu.
/K. Barteczko/
Zbyt duże zagnieżdżenie funkcji @cicik jest może i błędem, ale programisty...

Za B.W. Kernighan, R. Pike "Lekcja programowania":
Cytat
Używaj wyjątków tylko w sytuacjach wyjątkowych... Często nadużywa się wyjątków... Fakt, że nie można otworzyć pliku, trudno traktować jako coś wyjątkowego; generowanie wyjątku w takim wypadku to... uderzający przykład przerostu inżynierii w oprogramowaniu.
Powinno się zarezerwować wyjątki dla naprawdę nieoczekiwanych zdarzeń, takich jak przepełnienie systemu plików czy błędy w obliczeniach zmiennopozycyjnych.

Generowanie wyjątku, aby zmienić sterowanie programem, jest wygodym rozwiązaniem, ale nie zawsze koniecznym i zdecydowanie zbyt często nadużywanym (i na pewno nie stanowi alternatywy dla składni if).
dr_bonzo
Cytat
Używaj wyjątków tylko w sytuacjach wyjątkowych... Często nadużywa się wyjątków... Fakt, że nie można otworzyć pliku, trudno traktować jako coś wyjątkowego; generowanie wyjątku w takim wypadku to... uderzający przykład przerostu inżynierii w oprogramowaniu.
Powinno się zarezerwować wyjątki dla naprawdę nieoczekiwanych zdarzeń, takich jak przepełnienie systemu plików czy błędy w obliczeniach zmiennopozycyjnych.


Dla mnie to jest przegiecie, to mam przy prawie kazdym dodawaniu sprawdzac czy nie wystapi przepelnienie i wyrzucic wyjatek?
Blad w obliczeniach zmiennoprzecinkowych? Jaki? NaN ? przeciez to wartosc przewidziana w specyfikacji liczb zm.przec. w IEEE754.

Gdy bedziemy uzywac wyjatkow tylko do obslugi zdarzen super-wyjatkowych (pomijam tu uzywanie wyjatkow do zmiany sterowania przebiegiem kodu -- tu na pewno sie nie nadaja; Ruby ma raise/rescue -- jako obsluga bledow i throw/catch do sterowania przebiegiem kodu. Koniec dygrasji) to kod bedzie wygladal jak w jezyku bez wyjatkow -- multum zagniezsdzonych ifow.

Grrr
LBO
PHP5 Exception handling
Sądzę, że to pomoże.
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.