Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> wyjatki - problem
Rafiki
post
Post #1





Grupa: Zarejestrowani
Postów: 90
Pomógł: 0
Dołączył: 29.12.2005
Skąd: Z krzaków

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


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Prosze o pomoc i z gory dziekuje.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 14)
Cysiaczek
post
Post #2





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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.

Ten post edytował Cysiaczek 14.08.2006, 19:10:20
Go to the top of the page
+Quote Post
mike
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Przykład: http://forum.php.pl/index.php?s=&showt...st&p=264066
Go to the top of the page
+Quote Post
hwao
post
Post #4


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Podstawy wyjątków, warto żebyś przeczytał... patrząc na to co piszesz.
Go to the top of the page
+Quote Post
Rafiki
post
Post #5





Grupa: Zarejestrowani
Postów: 90
Pomógł: 0
Dołączył: 29.12.2005
Skąd: Z krzaków

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


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 (IMG:http://forum.php.pl/style_emoticons/default/thumbsupsmileyanim.gif)

Ten post edytował Rafiki 15.08.2006, 11:46:02
Go to the top of the page
+Quote Post
hwao
post
Post #6


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Exception zawsze musi byc na samym końcu
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #7





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




@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. (IMG:http://forum.php.pl/style_emoticons/default/laugh.gif)

Pozdrawiam.
Go to the top of the page
+Quote Post
hwao
post
Post #8


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




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. (IMG:http://forum.php.pl/style_emoticons/default/laugh.gif)

Pozdrawiam.

To wtedy jaki jest sens pisanie pozostałych (tych pod exception?)? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #9





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




No w takim układzie to żaden (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Pozdrawiam
Go to the top of the page
+Quote Post
mike
post
Post #10





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


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





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


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 :/
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #12





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




:roll2: Ja tylko pokazuję, że można... nie mówię, że to ma jakieś uzasadnienie projektowe (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Zdrówka. (IMG:http://forum.php.pl/style_emoticons/default/laugh.gif)

Ten post edytował Cysiaczek 15.08.2006, 15:13:05
Go to the top of the page
+Quote Post
mike
post
Post #13





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #14





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


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





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


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ć :/
Go to the top of the page
+Quote Post

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: 24.08.2025 - 20:37