Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: exception + adodb
Forum PHP.pl > Forum > PHP
piczu
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.
mike
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?
piczu
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.
mike
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
piczu
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
mike
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. ?>
piczu
wiec nici z wlasnego opsu wyjatku __toString ?
mike
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ę.
piczu
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 ?
mike
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.
piczu
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.
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.