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


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
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 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. laugh.gif

Pozdrawiam.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
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. laugh.gif

Pozdrawiam.

To wtedy jaki jest sens pisanie pozostałych (tych pod exception?)? 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 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


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
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 :/


--------------------
Nie lubię jednorożców.
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 tongue.gif

Zdrówka. laugh.gif

Ten post edytował Cysiaczek 15.08.2006, 15:13:05


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
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 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.


--------------------
Nie lubię jednorożców.
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
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 03:00