Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Exception, __autoload, error_handler
Forum PHP.pl > Forum > PHP > Object-oriented programming
koala
Witam !
W pliku index.php mam m.in. :
  1. <?php
  2. set_exception_handler('exception_handler');
  3. set_error_handler('error_handler');
  4. function exception_handler( $e )
  5. {
  6. echo '<b>Exception :</b><br />';
  7. echo 'komunikat => '.$e->getMessage().'<br />';
  8. echo 'plik => '.$e->getFile().'<br />';
  9. echo 'linia => '.$e->getLine().'<br />';
  10.  
  11. } // end : function exception_handler();
  12.  
  13. function error_handler($severity, $message, $filepath, $line)
  14. {
  15. echo '$severity - '.$severity.'<br />';
  16. echo '$message - '.$message.'<br />';
  17. echo '$filepath - '.$filepath.'<br />';
  18. echo '$line - '.$line.'<br />';
  19.  
  20. } // end : function error_handler();
  21.  
  22. require( DIR_LIB.'ccc'.EXT );
  23.  
  24.  
  25. function __autoload( $class )
  26. { 
  27. echo '1. Klasa - '.$class.'<br />';
  28. CCC::loadClass( $class );
  29. } // end : function __autoload($class);
  30.  
  31. $config = CCC_Config::get_instance();
  32. ?>

Klasa CCC_Config istnieje i ładuje ją jak trzeba.
Klasy CCC_Router nie ma, istnieje pusty plik router.php i po takiej próbie wczytania :
  1. <?php
  2. $router = CCC::loadClass( 'CCC_Router' );
  3. ?>

dostaję prawidłowy komunikat :
  1. Exception :
  2. komunikat => Plik Router.php załadowany ale nie ma w nim klasy => CCC_Router
  3. plik => E:\xampp\xampp\htdocs\jg\lib\ccc.php
  4. linia => 91

jeśli spróbuję ją wczytać przez __autoload :
  1. <?php
  2. $router = new CCC_Router;
  3. ?>

dostaję taki komunikat :
  1. Fatal error: Class 'CCC_Router' not found in E:\xampp\xampp\htdocs\jg\index.php on line 137

czyli nie dość że nie używa mojego error_handler'a to - on line 137 - chociaż ostatnimi znakami w tym pliku są w lini 136 -> "?>", po nich nie ma nawet spacji.
Jeśli nie ma nawet pliku router.php to mam taki komunikat :
  1. 1. Klasa - CCC_Router
  2. 2. Klasa - CCC_Router
  3. Fatal error: Class 'CCC_Router' not found in E:\xampp\xampp\htdocs\jg\index.php on line 137

czyli znowu ani error_handler ani exception_handler. Coś chyba robię nie tak ale już nie wiem co.
no i jeszcze metoda loadClass z klasy CCC :
  1. <?php
  2. static public function loadClass( $class )
  3. {
  4.  if( preg_match( '/[^a-z0-9-_.]/i', $class ) )
  5. {
  6. throw new Exception('Security : Nielegalne znaki w nazwie klasy');
  7. }
  8.  
  9. if( class_exists( $class, false ) )
  10. {
  11. echo "Klasa ".$class." już załadowana<br />";
  12. return;
  13. }
  14.  
  15. // Zamiana nazwy klasy na ścieżkę
  16. $path = str_replace('_', DIRECTORY_SEPARATOR, $class);
  17. if( $path != $class )
  18. {
  19. $dirs = dirname( $path );
  20. $file = basename( $path ).EXT;
  21. }
  22. else
  23. {
  24. $file = $class.EXT;
  25. }
  26.  
  27. if( file_exists( DIR_APP_LIB.$dirs.'/'.$file ) )
  28. {
  29. require( DIR_APP_LIB.$dirs.'/'.$file );
  30. }
  31. else
  32. {
  33. if( file_exists( DIR_LIB.$dirs.'/'.$file ) )
  34. {
  35. require( DIR_LIB.$dirs.'/'.$file );
  36. }
  37. else
  38. {
  39. echo '2. Klasa - '.$class.'<br />';
  40. throw new Exception('Pliku '.$file.' nie znalazłem');
  41. }
  42. }
  43.  
  44. if( ! class_exists( $class, false ) )
  45. {
  46. throw new Exception( 'Plik '.$file.' załadowany '
  47.  . 'ale nie ma w nim klasy => '.$class );
  48. }
  49.  
  50. } // end : public static function loadClass();
  51. ?>

To że pokazuje się 2. Klasa CCC_Router oznacza, jest w metodzie loadClass, (według mnie) że powinno wyświetlić komunikat z exception_handler'a bo do tego miejsca dochodzi a jednak Fatal error i to nawet nie z mojego error_handlera. Bardzo proszę o jakąś podpowiedź co zrobiłem nie tak ?

Zmieniając w loadClass na :
  1. <?php
  2. if( file_exists( DIR_APP_LIB.$dirs.'/'.$file ) )
  3. {
  4. require( DIR_APP_LIB.$dirs.'/'.$file );
  5. }
  6. else
  7. {
  8. require( DIR_LIB.$dirs.'/'.$file );
  9. }
  10. ?>

przy braku pliku router.php mam taki komunikat :
  1. 1. Klasa - CCC_Config
  2. 1. Klasa - CCC_Router
  3. $severity - 2
  4. $message - CCC::require(E:/xampp/xampp/htdocs/jg/lib/CCC/Router.php) [function.CCC-require]: failed to open stream: No such file or directory
  5. $filepath - E:\xampp\xampp\htdocs\jg\lib\ccc.php
  6. $line - 78
  7.  
  8. Fatal error: CCC::require() [function.require]: Failed opening required 'E:/xampp/xampp/htdocs/jg/lib/CCC/Router.php' (include_path='.;E:\xampp\xampp\php\pear') in E:\xampp\xampp\htdocs\jg\lib\ccc.php on line 78

natomiast jeśli jest pusty plik router.php
  1. Fatal error: Class 'CCC_Router' not found in E:\xampp\xampp\htdocs\jg\index.php on line 137
Athlan
Tylko że popatrz... error_handler jest uzywany przy warningach, noticach itp, a Fatal Error wykonywany jest w trakcie kompilacji kodu, czyli funkcja nie jest jeszcze załadowana... tak samo z parse errorami. Notice i Warningi da się jednak wyłapać. Kawałek kodu z autoloada i używania error handlera:

  1. <?php
  2. /**
  3.  * Autoload classes
  4.  * 
  5.  * NOTE: Vframe use autoload function to catch files of require classess and lib
    raries
  6.  */
  7.  
  8. function __autoload($sLibrary)
  9. {
  10. echo Vframe::getCoreMap($sLibrary);
  11. }
  12.  
  13. /**
  14.  * Error handler to catch exception class
  15.  * 
  16.  * NOTE: See at VerrorHandler() handle function
  17.  */
  18.  
  19. set_error_handler("VerrorHandler");
  20.  
  21. /**
  22.  * Handler for errors, warnings and notices, if 
  23.  * V_MODE_THROWERRHANDLE is TRUE than errors witch
  24.  * $bHandle (TRUE) flag will be throw in Vexception
  25.  * class
  26.  * 
  27.  * ATTENTION: Do not modify that code!
  28.  */
  29.  
  30. function VerrorHandler($iErrorNo, $sErrorString, $sErrorFile, $sErrorLine)
  31. {
  32. $bHandle = TRUE;
  33.  
  34. switch ($iErrorNo)
  35. {
  36. case E_WARNING:
  37. $sOutput = "WARNING thrown: ";
  38. $bHandle = TRUE;
  39. break;
  40.  
  41. case E_PARSE:
  42. $sOutput = "PARSE ERROR thrown: ";
  43. $bHandle = TRUE;
  44. break;
  45.  
  46. case E_NOTICE:
  47. $sOutput = "NOTICE thrown: ";
  48. $bHandle = FALSE;
  49. break;
  50.  
  51. case E_CORE_ERROR:
  52. $sOutput = "CORE ERROR thrown: ";
  53. $bHandle = TRUE;
  54. break;
  55.  
  56. case E_CORE_WARNING:
  57. $sOutput = "CORE WARNING thrown: ";
  58. $bHandle = TRUE;
  59. break;
  60.  
  61. case E_COMPILE_ERROR:
  62. $sOutput = "COMPILE ERROR thrown: ";
  63. $bHandle = TRUE;
  64. break;
  65.  
  66. case E_COMPILE_WARNING:
  67. $sOutput = "COMPILE WARNING thrown: ";
  68. $bHandle = TRUE;
  69. break;
  70.  
  71. case E_USER_ERROR:
  72. $sOutput = "USER FATAL ERROR thrown: ";
  73. $bHandle = TRUE;
  74. break;
  75.  
  76. case E_USER_WARNING:
  77. $sOutput = "USER WARNING thrown: ";
  78. $bHandle = TRUE;
  79. break;
  80.  
  81. case E_USER_NOTICE:
  82. $sOutput = "USER NOTICE thrown: ";
  83. $bHandle = FALSE;
  84. break;
  85.  
  86. default:
  87. $sOutput = "USER (UNKNOWN) ERROR thrown: ";
  88. $bHandle = FALSE;
  89. break;
  90. }
  91.  
  92. $sOutput .= $sErrorString . ' in ' . $sErrorFile . ' on line ' . $sErrorLine;
  93.  
  94. if(V_MODE_THROWERRHANDLE === TRUE && $bHandle)
  95. throw new Vexception($sOutput);
  96. }
  97. ?>
koala
Fajnie że wreszcie ktoś się odezwał. Dzięki Athlan.

Zastanawia mnie fakt (przedostatni komunikat) że przy braku pliku pojawiają się obydwa komunikaty i Fatal error i z mojego error handlera a chciałbym dostać tylko "mój" error tzn.
if (ADMIN == TRUE) to cały komunikat albo jeśli to nie ADMIN to np.: Przepraszamy za usterki sad.gif a tak to wszystko na nic. Da się coś z tym fantem zrobić ?
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.