Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> exception + adodb
piczu
post
Post #1





Grupa: Zarejestrowani
Postów: 182
Pomógł: 0
Dołączył: 4.01.2005
Skąd: piczu.info

Ostrzeżenie: (10%)
X----


Jak zrobic w Ado wlasne wyjatki?
Probowalem tak (w skrocie):
  1. <?
  2. class DAOException extends ADODB_Exception { 
  3.  
  4. private static $num = 0;
  5.  
  6. function __toString() {
  7. $msg = '<hr />ADOException<br /><br />';
  8. $msg .= ($this->getMessage()) ? $this->getMessage().'<br /><br />' : '' ;
  9. return $msg;
  10. } 
  11. }
  12.  
  13.  
  14. try {
  15. $connection = NewADOConnection($type);
  16. $connection->Connect($host,$user,$passwd,$name);
  17. if(!$connection->IsConnected()) throw new DAOException('Cannot connect');
  18. } catch (DAOException $e) {
  19. echo $e;
  20. }
  21.  
  22. ?>


ale przy "throw new" odwoluje sie do konstruktora.


--------------------
pozdrawiam :)
Go to the top of the page
+Quote Post
mike
post
Post #2





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

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


Cytat(piczu @ 6.06.2006, 20:59 ) *
ale przy "throw new" odwoluje sie do konstruktora.


A to ci niespodzianka tongue.gif
Oczywiście że operator new stworzy nowy obiekt, a jedyną metodą na to jest wywołanie konstruktora.

Ale nie rozumiem dlaczego jest to problem?
Go to the top of the page
+Quote Post
piczu
post
Post #3





Grupa: Zarejestrowani
Postów: 182
Pomógł: 0
Dołączył: 4.01.2005
Skąd: piczu.info

Ostrzeżenie: (10%)
X----


zostawmy moze ten konstruktor smile.gif
ten kawalek kodu ktory przedstawilem nie dziala. A dowodem chyba jest blad :
Kod
Fatal error: Uncaught exception 'ADODB_Exception' with message 'mysql error: [: ] in CONNECT ...

ktory wskazuje ze wyjatek nie zostal wylapany. Wiec co jest nie tak.


--------------------
pozdrawiam :)
Go to the top of the page
+Quote Post
mike
post
Post #4





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

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


No przecież nigdzie nie łapiesz wyjątku klasy ADODB_Exception stąd błąd.
Poczytaj po pierwsze o zagadnieniach związanych z propagacją wyjątków.
Oraz bardzo dokładnie przeanalizuj przykłady w manualu: http://pl2.php.net/manual/pl/language.exceptions.php
Go to the top of the page
+Quote Post
piczu
post
Post #5





Grupa: Zarejestrowani
Postów: 182
Pomógł: 0
Dołączył: 4.01.2005
Skąd: piczu.info

Ostrzeżenie: (10%)
X----


ok przejrzalem i zrobilem lapanie przy laczeniu
  1. <?
  2. if(self::$connection->Connect(self::$host,self::$user,self::$passwd,self::$name)) throw new DAOException(__CLASS__.': Cannot connect');
  3. ?>

ale nadal nie lapie sad.gif

EDIT:
zmienilem przy catch na ADODB_Exception i chyba lapie ale w ten sposob nie moge uzyc wlasnego opisu wyjatkow smile.gif

Ten post edytował piczu 7.06.2006, 16:19:01


--------------------
pozdrawiam :)
Go to the top of the page
+Quote Post
mike
post
Post #6





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

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


Przy łapaniu wyjątków ważne sa zależności między nimi.
Jeśli łapiesz wykątek klasy głównej Exception to łapiesz ten wyjątek i wyjątki klas pochodnych po tej klasie.
Jeśli po klasie AException dziedziczy BException to jak łapiesz BException to łapiesz tylko ją, ale jak łapiesz AException to lapiesz obie.

Dlatego u Ciebie przy lapaniu DAOException nie wychwytuje ADODB_Exception.

Zawsze powinieneś lapać od szczegółowych do ogólnych.

  1. <?php
  2.  
  3. try
  4. {
  5. // ...
  6. }
  7. catch( DAOException $e )
  8. {
  9. // ...
  10. }
  11. catch( ADODB_Exception $e )
  12. {
  13. // ...
  14. }
  15. catch( Exception $e )
  16. {
  17.  // ...
  18. }
  19.  
  20. ?>
Go to the top of the page
+Quote Post
piczu
post
Post #7





Grupa: Zarejestrowani
Postów: 182
Pomógł: 0
Dołączył: 4.01.2005
Skąd: piczu.info

Ostrzeżenie: (10%)
X----


wiec nici z wlasnego opsu wyjatku __toString ?

Ten post edytował piczu 7.06.2006, 16:29:29


--------------------
pozdrawiam :)
Go to the top of the page
+Quote Post
mike
post
Post #8





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

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


Nie. Dlaczego?
Musisz po prostu zadbac o to by zanim zostanie zgłoszony wyjątek klasy ADODB_Exception wyrzucony został wyjątek klasy DAOException.
Po prostu w twoim kodzie zanim nastąpi throw new ... gdzieś AdoAD wywala coś swojego i to Ci psuje aplikację.
Go to the top of the page
+Quote Post
piczu
post
Post #9





Grupa: Zarejestrowani
Postów: 182
Pomógł: 0
Dołączył: 4.01.2005
Skąd: piczu.info

Ostrzeżenie: (10%)
X----


ok to juz rozumie, teraz zostaje konstruktor smile.gif
przy throw new wyrzyca mi
Kod
Warning: Missing argument 2 for ADODB_Exception::__construct(), called in dataaccess.class.php on line 115 and defined in adodb-exceptions.inc.php on line 29

Warning: Missing argument 3 for ADODB_Exception::__construct(), called in dataaccess.class.php on line 115 and defined in adodb-exceptions.inc.php on line 29

Warning: Missing argument 4 for ADODB_Exception::__construct(), called in dataaccess.class.php on line 115 and defined in adodb-exceptions.inc.php on line 29

Warning: Missing argument 5 for ADODB_Exception::__construct(), called in dataaccess.class.php on line 115 and defined in adodb-exceptions.inc.php on line 29

Warning: Missing argument 6 for ADODB_Exception::__construct(), called in dataaccess.class.php on line 115 and defined in adodb-exceptions.inc.php on line 29

Warning: Missing argument 7 for ADODB_Exception::__construct(), called in dataaccess.class.php on line 115 and defined in adodb-exceptions.inc.php on line 29

i co to maja byc za argumenty ?


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


Pokaż jak zbudowałeś ten konstruktor.
Konstruktor klasy ADODB_Exception potrzebuje parametów, których najwidoczniej nie dostał. Jakie? Zajrzyj do definicji tej klasy.

P.S.
Tak sobie myślę o tej dyskusji i dochodzę do wniosku, że może Ci wygodniej będzie z Creole a nie z AdoDB. Creole jest napisane stricte na PHP5 i ma bardzo ładny obiektowy kod, wykorzystujący wszystkie możliwości obiektowe PHP5.
Go to the top of the page
+Quote Post
piczu
post
Post #11





Grupa: Zarejestrowani
Postów: 182
Pomógł: 0
Dołączył: 4.01.2005
Skąd: piczu.info

Ostrzeżenie: (10%)
X----


kontruktor
  1. <? ...
  2. function __construct($dbms, $fn, $errno, $errmsg, $p1, $p2, $thisConnection)
  3. ... ?>


w zrodle znajduje sie jeszcze funkcja, prawdop sluzaca do wyrzucania wyjatkow, jednak ma ona tyle samo parametrow co konstruktor
  1. <? ...
  2. function adodb_throw($dbms, $fn, $errno, $errmsg, $p1, $p2, $thisConnection)
  3. ... ?>

Chyba dam sobie z tym spokoj.

W sumie AdoDB_lite, bo uzywam wersji odchudzonej, jest mi potrzebne jako alternatywa dla PDO w moim projekcie, ale chce zeby wszystko dzialalo jak nalezy, wiec przegugluje o tym Creole i moze sie przerzuce.

Dzieki za wszystko.

Ten post edytował piczu 8.06.2006, 19:14:59


--------------------
pozdrawiam :)
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: 19.08.2025 - 17:52