Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> "throw" w __autoload
pawel_k
post
Post #1





Grupa: Zarejestrowani
Postów: 211
Pomógł: 3
Dołączył: 29.07.2005
Skąd: Szczebrzeszyn

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


witam wszystkich.
mam taki mały problem, czy da się przechwycić wyjątki wyrzucone przez __autoload() ?

kod mam następujący:

  1. <?php
  2. try
  3. {
  4. $resConn = DB::getConn();
  5. $objSmarty->display('common/index.tpl');
  6. }
  7. catch(DBconnError $e1)
  8. {
  9. $objSmarty->display('common/DBerror.tpl');
  10. }
  11. catch(NoClassFoundError $e2)
  12. {
  13.  $objSmarty->display('common/NoClassFoundError.tpl');
  14. }
  15.  
  16. ?>


a w klasie DB:
  1. <?php
  2. class DB
  3. {
  4. /**
  5.  * resConnection - przechwuje identyfikator połączenia z bazą danych
  6.  *
  7.  * @var resource
  8.  * @access private
  9.  */
  10. private static $resConnection;
  11.  
  12. /**
  13.  * objDataBase - obiekt odpowiedzialny za komunikację z bazą danych
  14.  *
  15.  * @var object
  16.  * @access private
  17.  */
  18.  private static $objDataBase;
  19.  
  20. /**
  21.  * Konstruktor - tworzy nowy obiekt odpowiedzialny za komunikację z bazą danych
  22.  *
  23.  * @param void
  24.  * @access private
  25.  * @return void
  26.  * @throws NoClassFoundError
  27.  * @throws DBconnError
  28.  */
  29. private function __construct()
  30. {
  31. try
  32. {
  33. $strDB_Class = DB_TYPE.'DB_handler';
  34. $this->objDataBase = new $strDB_Class();
  35.  
  36. }
  37. catch(NoClassFoundError $e)
  38. {
  39. throw $e;
  40. }
  41.  
  42. if(!($this->resConnection = $this->objDataBase->getConnection()))
  43. {
  44. throw new DBconnError();
  45. }
  46. }
  47.  
  48. /**
  49.  * getConn metoda zwraca identyfikator połączenia
  50.  *
  51.  * @param void
  52.  * @access public
  53.  * @return resource
  54.  * @throws NoClassFoundError
  55.  * @throws DBconnError
  56.  */
  57. public static function getConn()
  58. {
  59. if(!self::$resConnection)
  60. {
  61. try
  62. {
  63. new DB();
  64. }
  65. catch(NoClassFoundError $e1)
  66. {
  67. throw $e1;
  68. }
  69. catch(DBconnError $e2)
  70. {
  71. throw $e2;
  72. }
  73. }
  74. return self::$resConnection;
  75. }
  76. }
  77.  
  78. ?>


autoloader wyglada tak:
  1. <?php
  2.  
  3. function __autoload($strClass)
  4. {
  5. if(file_exists('../modules/'.$strClass.'/class.'.$strClass.'.php'))
  6. {
  7. @require_once('../modules/'.$strClass.'/class.'.$strClass.'.php');
  8. }
  9. else
  10. {
  11. throw new NoClassFoundError();
  12. }
  13. }
  14.  
  15. ?>


i teraz jak próbuję wczytać klasę która nie istnieje to zamiast przechwycić mi błąd najpierw w klasie DB i przekazać go do obsłużenia do index.php wyświetla mi w przeglądarce:
Cytat
Fatal error: Function __autoload(PostgresqlDB_handler) threw an exception of type 'NoClassFoundError' in /var/www/projekty/framework/libs/DB/class.DB.php on line 56

można jakoś przechwycić ten wyjątek?
Go to the top of the page
+Quote Post
Ociu
post
Post #2





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




Nie da się. Można to wyrzucić tak jak to było w phiendzie2, czyli w eval() utworzyć klasę, gdzie w jej konstruktorze będzie wypluwany wyjątek.
Go to the top of the page
+Quote Post
pawel_k
post
Post #3





Grupa: Zarejestrowani
Postów: 211
Pomógł: 3
Dołączył: 29.07.2005
Skąd: Szczebrzeszyn

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


pogooglowalem troche i znalazlem cos takiego:
http://bugs.php.net/bug.php?id=31102

właściwie to zmieniłem konstruktor tak jak mniej wiecej tam było, czyli
  1. <?php
  2. private function __construct()
  3. {
  4. try
  5. {
  6. $strDB_Class = DB_TYPE.'DB_handler';
  7. __autoload($strDB_Class);
  8. $this->objDataBase = new $strDB_Class();
  9. #__autoload("Bug"); // Prints "exception caught."
  10. }
  11. catch(NoClassFoundError $e)
  12. {
  13. throw $e;
  14. }
  15. catch(Exception $e2)
  16. {
  17. throw $e2;
  18. }
  19.  
  20. if(!($this->resConnection = $this->objDataBase->getConnection()))
  21. {
  22. throw new DBconnError();
  23. }
  24. }
  25.  
  26. ?>
chociaż za ładnie kod nie wygląda i trzeba jeszcze przerobić __autoload()...

a możesz napisać jak by to wyglądało z eval() ?
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




w __autoload wyrzuconych wyjadkow nie obsluzysz (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Dopiero w PHP6 ma to byc
Go to the top of the page
+Quote Post
Radarek
post
Post #5





Grupa: Zarejestrowani
Postów: 188
Pomógł: 0
Dołączył: 23.05.2005

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


Z tym, ze jaki jest sens tego? Skoro danej klasy nie znaleziono tzn ze cos zostalo zle zaprogramowane (bo przeciez nie moze zdarzyc sie sytuacja, ze nie znaleziono definicji klasy). Nawet jesli zlapiesz wyjatek 'NoClassFoundError' to co zrobisz z takim wyjatkiem? (swoja droga zgodnie ze sposobem nazywania klas wyjatkow powinno byc 'NoClassFoundException', ale to szczegol (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ).
Go to the top of the page
+Quote Post
pawel_k
post
Post #6





Grupa: Zarejestrowani
Postów: 211
Pomógł: 3
Dołączył: 29.07.2005
Skąd: Szczebrzeszyn

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


nie do końca coś zle zostało zaprogramowane, po prostu wczytywany jest moduł który akurat nie jest załadowany...

a co do nazewnictwa to stosuję zasadę że ---Error to wyjątki przerywające sktypt po których wyświetlona zostaje strona z info o błędzie (np. w przypadku gdy nie można połączyć się z bazą danych info o problemach technicznych i że zapraszam później (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ), ---Exception powodują zmianę trypu wykonania, np przeniesienie na inną podstronę...

Ten post edytował pawel_k 4.02.2006, 20:10:27
Go to the top of the page
+Quote Post
Ociu
post
Post #7





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




Myślę, że hawk nie będzie miał nic przeciwko:
  1. <?php
  2. eval("class $strClass { public function __construct() { throw new NoSuchClassException('$strClass not found'); } }");
  3. ?>
Go to the top of the page
+Quote Post
chmolu
post
Post #8





Grupa: Zarejestrowani
Postów: 179
Pomógł: 0
Dołączył: 8.10.2004

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


Da się wywalać wyjątki w __autoload. Trzeba tylko trochę to obejść. Przykład z Phienda:

  1. <?php
  2. if (!class_exists($class, false) && !interface_exists($class, false)) {
  3. eval("class $class { public function __construct() { throw new ClassNotFoundException('$class not found'); } }");
  4. }
  5. ?>
Go to the top of the page
+Quote Post
pawel_k
post
Post #9





Grupa: Zarejestrowani
Postów: 211
Pomógł: 3
Dołączył: 29.07.2005
Skąd: Szczebrzeszyn

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


thx Ociu i chmolu :]
Go to the top of the page
+Quote Post
hwao
post
Post #10


Developer


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




Cytat(chmolu @ 2006-02-04 23:37:45)
Da się wywalać wyjątki w __autoload. Trzeba tylko trochę to obejść.

a obsluzysz je?
Go to the top of the page
+Quote Post
aleksander
post
Post #11





Grupa: Przyjaciele php.pl
Postów: 742
Pomógł: 0
Dołączył: 14.12.2003
Skąd: Gdańsk, Trójmiasto

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


set_exception_handler ?
Go to the top of the page
+Quote Post
bela
post
Post #12


Administrator PHPedia.pl


Grupa: Developerzy
Postów: 1 102
Pomógł: 2
Dołączył: 14.09.2003

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


Set_exception_handler to główne zło świata :] A bardziej serio, to to jest zla praktyka, bo poczatkujacy developer mysli sobie, ze jesli moze utworzyc handler, no to po co lapac wyjatki.
Ja w pliku index mam klauzure try/catch, tam gdzie wywoluje aplikacji i jest si.
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: 10.10.2025 - 16:00