Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: wyjatki - problem
Forum PHP.pl > Forum > PHP > Object-oriented programming
Rafiki
Witam.

Stworzylem plik extends w ktorym mam:

  1. <?php
  2. class system_Exception extends Exception {
  3. }
  4. ?>


nic wielkiego ...

Procz tego mam klase do obslugi mysqla, z cacheowaniem i inne 'gadzety'. W klasie tej w niektorych miejscach generowane sa wyjatki min w konstruktorze ktory ma za zadanie wywolanie polaczenia z baza, gdy polaczenie sie nie powiedzie generowany jest wyjatek w taki sposob:

  1. <?php
  2. throw new system_Exception('Błąd w nawiązaniu połączenia z bazą danych - ' . mysqli_connect_error($this -> connect) . ' - ' . mysqli_connect_errno($this -> connect));
  3. ?>


Niby wszystko ok... teraz mam index.php

  1. <?php
  2. include_once('config.php');
  3. include_once('libs/exceptions.class.php');
  4. include_once('libs/sql.class.php');
  5.  
  6. try
  7. {
  8. $sql = & new sql('localhostaaa', 'user', 'password', 'dbname');
  9. } catch (Exception $Ex) {
  10. include($site['dir'] . 'templates/' . $site['template'] . '/Exception.php');
  11. } catch (system_Exception $sys_Ex) {
  12. include($site['dir'] . 'templates/' . $site['template'] . '/system_Exception.php');
  13. }
  14. ?>


Dane przy wywolaniu klasy sa specjalnie zle podane aby zostal wychwycony wyjatek... ale wyjatek przechwyca catch z Exception a nie z system_Exception mimo ze w klasie do obslugi sql wywolywalem system_Exceptions.

System Exceptions ma sie roznic tym od zwyklego wyjatku ze ma wywalac bledy w 'jadrze' systemu na surowo na bialym tle z dokladnym opisem, linia bledu itd itd... zas zwykly wyjatek ma wyswietlac sam opis ktory ma sie wyswietlac w jakiejs okreslonej szacie graficznej strony, ale niestety nie dziala gdyz system_Exceptions pokazuje sie tak jak powinien sie pokazywac zwykly Exceptions ( bynajmiej tak mi sie wydaje smile.gif

Prosze o pomoc i z gory dziekuje.
Cysiaczek
Kwestia dziedziczenia.
Klasa system_Exception jest jednocześnie specjalizacją klasy Exception i jako taki jej obiekt jest przechwytywany jako pierwszy.
Po prostu przechwytywanie Exception daj do ostatniego catch i będzie działać,

Pozdrawiam.
mike
Przykład: http://forum.php.pl/index.php?s=&showt...st&p=264066
hwao
Podstawy wyjątków, warto żebyś przeczytał... patrząc na to co piszesz.
Rafiki
Przeczytałem juz wczesniej, ale nie zwróciłem uwagi piszac skrypt ze Exception w tym przypadku musi byc na koncu.

Widzac co piszesz... ahah thumbsupsmileyanim.gif
hwao
Exception zawsze musi byc na samym końcu
Cysiaczek
@hwao - nie, nie musi być na końcu. Jeśli chcesz po prostu przechwycić błędy, a nie interesuje Cię jaki to błąd, to możesz śmiało 'przekleić' Exception na początek. laugh.gif

Pozdrawiam.
hwao
Cytat(Cysiaczek @ 15.08.2006, 15:49 ) *
@hwao - nie, nie musi być na końcu. Jeśli chcesz po prostu przechwycić błędy, a nie interesuje Cię jaki to błąd, to możesz śmiało 'przekleić' Exception na początek. laugh.gif

Pozdrawiam.

To wtedy jaki jest sens pisanie pozostałych (tych pod exception?)? smile.gif
Cysiaczek
No w takim układzie to żaden tongue.gif
Pytanie jednak brzmi: co zrobić, gdy chcemy w jednakowy sposób zareagowac na jakiekolwiek wyjatki?
  1. <?php
  2. //ano. Możemy przekleić Exception
  3. try{
  4. $ob=new Application();
  5. }
  6. catch (Exception $e){
  7. $logger->notify($e->getMessage());
  8. $logger->emailMe();
  9. }
  10. catch(specExc $e){}
  11. catch(specExc2 $e){}
  12. catch(specExc3 $e){}
  13. ?>


Co prawda przydatne raczej tylko przy testach...ale można smile.gif

Pozdrawiam
mike
W takiej sytuacji to też kiepskie wyjście.

Lepiej zachować normalną kolejnośc bloków catch, czyli od najszczegółowszego do Exception.

W takiej sytuacji kiedy chcemy na każdy wyjątek zareagować tak samo, to możesz dpisać troche kodu do klsy po której wszystkie dziedziczą.

Nie będziesz musiał zmieniać wszystkich try...catch w swojej aplikacji.
dr_bonzo
Manual: php przeglada kolejno wszystkie catch'e i po napotkaniu pierwszego z typem wyjatku bedacym klasa/nad-klasa aktualnie obslugiwanego wyjatku wchodzi do tego catch'a{}.

Cysiaczek:
juz lepiej to usun, bo wyglada jak bys nie przejmowal sie wystepujacymi wyjatkami. W tym przypadku wystarczy jeden catch z Exception
  1. <?php
  2. catch(specExc $e){}
  3. catch(specExc2 $e){}
  4. catch(specExc3 $e){}
  5. ?>


----------
edit: mike_mech

Cytat
W takiej sytuacji kiedy chcemy na każdy wyjątek zareagować tak samo, to możesz dpisać troche kodu do klsy po której wszystkie dziedziczą.

Reakcja na wyjatek jest jego obsluga w catch'u a nie wewnatrz obiektu wyjatku :/
Cysiaczek
:roll2: Ja tylko pokazuję, że można... nie mówię, że to ma jakieś uzasadnienie projektowe tongue.gif

Zdrówka. laugh.gif
mike
Cytat(dr_bonzo @ 15.08.2006, 16:08 ) *
----------
edit: mike_mech
Reakcja na wyjatek jest jego obsluga w catch'u a nie wewnatrz obiektu wyjatku :/

Tak wiem, ale można zrobić:
  1. <?php
  2. try
  3. {
  4. }
  5. catch( MyException $objException ) // MyException extends Exception a cała reszta extends MyException
  6. {
  7. $objException->logError();
  8. }
  9.  
  10. ?>


Hmm, ale takie teoretyzowanie już nie za daleko prowadzi smile.gif
dr_bonzo
Ja zrozumialem ze chodzilo ci o zajecie sie wyjatkiem przy jego tworzeniu, w konstruktorze tegoz wyjatku (z wywolaniem parent::__construct()) -- zapisaniem go do logu, itp.
mike
Cytat(dr_bonzo @ 15.08.2006, 17:14 ) *
Ja zrozumialem ze chodzilo ci o zajecie sie wyjatkiem przy jego tworzeniu, w konstruktorze tegoz wyjatku (z wywolaniem parent::__construct()) -- zapisaniem go do logu, itp.

O to też.
Zapomniałem dopisać :/
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-2024 Invision Power Services, Inc.