2013-02-08 3 views
8

В моем проекте, чтобы поймать все ошибки PHP Я настроил свой механизм обработки ошибок следующим образом:обработки ошибок в CodeIgniter

  1. Я поставил error_reporting() в index.php файл, который переопределяет ничего в файле php.ini
  2. обработчик ошибки устанавливается в system/codeigniter/CodeIgniter.php с помощью set_error_handler - это обработчик ошибок, _exception_handler, является найдено в system/codeigniter/Common.php
  3. _exception_handler функция игнорирует E_STRICT ошибки, вызывает show_php_error функции из системной библиотеки Исключения, если тяжесть является то, что определяется вашей error_reporting() функции в index.php и регистрирует ошибку в соответствии с все, что вы создали в вашем config.php файле
  4. Обработчика возвращает FALSE, поэтому после этого PHP продолжает обрабатывать ошибку , однако, как правило, это соответствует вашему уровню error_reporting и display_errors.

Дело в том, что озадачивает меня в том, что E_ERROR ошибки т.е. фатальные ошибки не кажется, быть пойманным _exception_handler вообще. Дело не только в том, что show_php_error не вызывается, похоже, что функция просто не вызвана для них. Это, очевидно, проблема, так как это означает, что они не обрабатываются show_php_error или не регистрируются. Например, если я намеренно ошибаюсь в контроллере $this->load->views('foo');, обработчик не вызывается.

Любое предложение об обработке ошибок было бы высоко оценено, спасибо!

+0

Я думаю, что это может быть проблема с самим PHP, не имея возможности проверить его. Если вы видите http://www.php.net/manual/en/function.error-reporting.php # 70126 вы увидите, что в этом случае E_ERROR вызывает аналогичный эффект, что и E_PARSE. – David

+0

какая среда вы используете? – bottleboot

ответ

4

Теперь это довольно большая дискуссия: Должны ли вы поймать фатальные ошибки или нет. Некоторые говорят, что они FATAL, поэтому вы не знаете, в каком состоянии находится система, но я пойду с «попытаюсь выполнить очистку, если возникла ошибка». Чтобы уловить ВСЕ фатальные ошибки, вам необходимо настроить привязку pre_system. перейти к применению/Config/hooks.php и введите

$hook['pre_system'][] = array(
'class' => 'PHPFatalError', 
'function' => 'setHandler', 
'filename' => 'PHPFatalError.php', 
'filepath' => 'hooks' 
); 

после этого перейти в каталог крючками и добавить обработку ошибки:

<?php 
    class PHPFatalError { 

    public function setHandler() { 
      register_shutdown_function('handleShutdown'); 
     } 

    } 

    function handleShutdown() { 
     if (($error = error_get_last())) { 
      ob_start(); 
       echo "<pre>"; 
      var_dump($error); 
       echo "</pre>"; 
      $message = ob_get_clean(); 
      sendEmail($message); 
      ob_start(); 
      echo '{"status":"error","message":"Internal application error!"}'; 
      ob_flush(); 
      exit(); 
     } 
    } 

, как вы можете видеть, что мы используем register_shutdown_function для запустите функцию, которая проверяет, произошла ли ошибка, и если она отправила ее по электронной почте разработчику. Эта установка работает безупречно более двух лет в нескольких проектах CI, с которыми я работал.

+0

Привет, я чувствую, что это действительно хороший подход, но в моем случае я разработал индивидуальный подход, когда у меня была функция register_shutdown_function() в вспомогательном классе для обработки общих ошибок проекта ... Спасибо YOu – troy

+0

Ну, вы можете складывать register_shutdown_function(), но нет другого способа (насколько я знаю), чтобы вы могли улавливать фатальные ошибки, кроме использования перехвата системы. – tix3

0

Я нашел этот ответ по другому вопросу (https://stackoverflow.com/a/3675357), и я думаю, что это также полезно для тех, кто читает этот вопрос. «Для обработки ошибок, специфичных для codeigniter, вы можете переопределить свой класс библиотеки« Исключение », создав класс My_Exception в папке вашего приложения/библиотек. Скопируйте в него исходные подписи библиотеки библиотеки и поместите в свой код. Это, безусловно, будет работать».

Смежные вопросы