set_error_handler в Codeigniter? - PullRequest
       3

set_error_handler в Codeigniter?

5 голосов
/ 23 августа 2010

Я создал несколько помощников, чтобы отлавливать любые ошибки PPH, а затем отправлять сообщение о сгибании, которое создаст тикет с моей программой отслеживания ошибок.

Но я не могу заставить его работать с Codeigniter. Вот мой код:


<? function phpErrorHandler($errno, $errstr, $errfile, $errline, $errcontext){

    //If is a notice do nothing.
    if($errno == E_NOTICE | $errno == E_USER_NOTICE): null; else:

    //Error types
    $errortype = array(
      E_ERROR           => 'Error',
      E_WARNING         => 'Warning',
      E_PARSE           => 'Parsing Error',
      E_NOTICE          => 'Notice',
      E_CORE_ERROR      => 'Core Error',
      E_CORE_WARNING    => 'Core Warning',
      E_COMPILE_ERROR   => 'Compile Error',
      E_COMPILE_WARNING => 'Compile Warning',
      E_USER_ERROR      => 'User Error',
      E_USER_WARNING    => 'User Warning',
      E_USER_NOTICE     => 'User Notice',
      E_STRICT          => "Runtime Notice");

    //Just get the filename for the title.
    $filenameGoBoom = explode('/',print_r( $errfile, true));
    $filename = end($filenameGoBoom);

    //MySQL
    if ($errstr == "(SQL)"):
        $errstr = "SQL Error [$errno] " . SQLMESSAGE . "<br />\n";
        $errstr .= "Query : " . SQLQUERY . "<br />\n";
        $errstr .=  "On line " . SQLERRORLINE . " in file " . SQLERRORFILE . " ";
    endif;

    //Write the report and set out the data
    $prefix = ($errortype[$errno]) ? $errortype[$errno] : "Unknown";
    $title = ($errortype[$errno]) ? $filename ." on line ". print_r( $errline, true) : "Unknown error type: [$errfile:$errline] [$errno] $errstr";
    $error = "\n\n---Data---\n". print_r( $errstr, true).
    "\n\n---File---\n". print_r( $errfile, true). "on line ". print_r( $errline, true)." @".date('Y-m-d H:i:s').
    "\n\n---Context---\n".print_r( $errcontext, true).
    "\n\n". print_r( debug_backtrace(), true);

        //Send! Show the error and stop executing the code
        sendError($prefix, $title , $error);

        echo "Whoops, something went wrong, it could of been something you did, or something we've done or didn't expect. Please try again, this error has been reported to us.".$errline.$errstr;

        die();

    endif;
}

function mysqlErrorHandler(){

    //Setup variables.
    $prefix = 'MySQL';
    $title = 'Error - '.mysql_errno();
    $error = 'MySQL Error '.mysql_errno().':'.mysql_error();

    //Send! 
    sendError($prefix,$title,$description);

    //Kill the script
    die();

}

function fatalErrorHandler(){

    $isError = false;
    if ($error = error_get_last()):
        switch($error['type']){
            case E_ERROR:
            case E_CORE_ERROR:
            case E_COMPILE_ERROR:
            case E_USER_ERROR:
            $isError = true;
            break;
            }
        endif;

    if ($isError):
        $prefix = 'Fatal';
        $title = 'Check this out';
        $error = $error['message'];

        sendError($prefix, $title , $error);

        echo "Whoops, something went wrong, it could of been something you did, or something we've done or didn't expect. Please try again, this error has been reported to us.";

    endif; 
}

set_error_handler('phpErrorHandler');
register_shutdown_function('fatalErrorHandler');
?>

Это не все отлично, но это код, который я использую. (несколько бит для очистки и удаления) Он находится во вспомогательном файле, который автоматически загружается с помощью codeigniter.

Есть идеи?

Спасибо.

1 Ответ

5 голосов
/ 09 сентября 2010

Вы можете быстро сделать несколько вещей, чтобы выяснить проблему.

  1. Используйте приведенный выше код в автономном скрипте php и создайте преднамеренную ошибку. Если код работает, то попробуйте найти механизм обработки ошибок, специфичный для codeigniter.

  2. Замените содержимое функции phpErrorHandler чем-то простым, например, напечатайте что-нибудь в журнале и посмотрите, выполняется ли сама функция в случае ошибки. Если да, то вам нужно только исправить код для обработчика ошибок.

  3. Для обработки ошибок, специфичных для codeigniter, вы можете переопределить ее библиотечный класс 'Exception', создав класс My_Exception в папке application / library. Скопируйте оригинальные сигнатуры библиотечных функций в нее и вставьте в ваш код. Это обязательно сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...