Advertisement
Guest User

php exception handler

a guest
Dec 12th, 2011
735
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.08 KB | None | 0 0
  1. <?php
  2.  
  3. namespace Base\Debug;
  4.  
  5. use Exception;
  6. use ErrorException;
  7.  
  8. /**
  9.  * Ловит все непойманные исключения и ошибки, передает их обработчику
  10.  *
  11.  * @package ExceptionHandler
  12.  * @version $id$
  13.  * @author Alexey Karapetov <karapetov@gmail.com>
  14.  */
  15. abstract class ExceptionHandler
  16. {
  17.     /**
  18.      * Последняя ошибка, прошедшая через handleError
  19.      *
  20.      * @var array
  21.      */
  22.     private $lastHandledError = null;
  23.  
  24.     private $isRunning = false;
  25.  
  26.     /**
  27.      * Установить как системный обработчик ошибок и исключений
  28.      *
  29.      * @param callable $handler Коллбек, которому будет передано пойманное исключение
  30.      * @param int $errorTypes Типы ошибок, которые надо ловить
  31.      * @return void
  32.      */
  33.     public function install($errorTypes = NULL)
  34.     {
  35.         if (is_null($errorTypes))
  36.         {
  37.             $errorTypes = E_ALL | E_STRICT;
  38.         }
  39.         set_exception_handler(array($this, 'exceptionCallback'));
  40.         set_error_handler(array($this, 'errorCallback'), $errorTypes);
  41.         register_shutdown_function(array($this, 'shutdownHandler'));
  42.     }
  43.  
  44.     /**
  45.      * Системный обработчик исключения.
  46.      * Устанавливается вызовом set_exception_handler()
  47.      *
  48.      * @param Exception     $e  Никем не пойманное исключение
  49.      * @return void
  50.      */
  51.     public function exceptionCallback(Exception $e)
  52.     {
  53.         if ($this->isRunning)
  54.         {
  55.             error_log('Exception occured inside handler');
  56.             return;
  57.         }
  58.         $this->isRunning = true;
  59.         $this->handleException($e);
  60.         $this->isRunning = false;
  61.     }
  62.  
  63.     /**
  64.      * Системный обработчик ошибок.
  65.      * Устанавливается вызовом set_error_handler()
  66.      *
  67.      * @param int       $errno      Код ошибки
  68.      * @param string    $errstr     Текстовое описание ошибки
  69.      * @param string    $errfile    Имя файла, где она произошла
  70.      * @param int       $errline    Номер строки в файле
  71.      * @param array     $errcontext Контекст
  72.      * @return true
  73.      */
  74.     public function errorCallback($errno, $errstr, $errfile = null, $errline = null, array $errcontext = array())
  75.     {
  76.         $this->lastHandledError = array(
  77.             'type'      => $errno,
  78.             'message'   => $errstr,
  79.             'file'      => $errfile,
  80.             'line'      => $errline,
  81.         );
  82.         if (error_reporting() & $errno)
  83.         {
  84.             require_once(__DIR__ . DIRECTORY_SEPARATOR . 'ContextAwareErrorException.php');
  85.             $error = new ContextAwareErrorException($errstr, $errno, $errno, $errfile, $errline);
  86.             $error->setContext($errcontext);
  87.             // формат тот же, что у error_get_last()
  88.             $this->exceptionCallback($error);
  89.         }
  90.         return true;
  91.     }
  92.  
  93.     /**
  94.      * Получить последнюю обработанную ошибку
  95.      *
  96.      * @return array|null
  97.      */
  98.     public function getLastHandledError()
  99.     {
  100.         return $this->lastHandledError;
  101.     }
  102.  
  103.     /**
  104.      * Системная функция, вызываемая при завершении скрипта.
  105.      * Реагирует только на на ошибки, не обработанные прежде.
  106.      *
  107.      * @access public
  108.      * @return void
  109.      */
  110.     public function shutdownHandler()
  111.     {
  112.         $error = error_get_last();
  113.         if ($error && $error != $this->getLastHandledError())
  114.         {
  115.             $this->errorCallback($error['type'], $error['message'], $error['file'], $error['line']);
  116.         }
  117.     }
  118.  
  119.     /**
  120.      * handleException
  121.      *
  122.      * @param Exception $e
  123.      * @return void
  124.      */
  125.     abstract function handleException(Exception $e);
  126. }
  127.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement