PHP.SU - Функция set_error_handler() - устанавливает пользовательский обработчик ошибок.

  Основы PHP
  Что такое PHP?
  Возможности PHP
  Преимущества PHP
  История развития
  Что нового в PHP5?
  «Движок» PHP
  Переход на PHP 5.3
New Переход на PHP 5.6
  Введение в PHP
  Изучение PHP
  Основы CGI
  Синтаксис PHP
  Типы данных PHP
  Переменные в PHP
  Константы PHP
  Выражения PHP
  Операторы PHP
  Конструкции PHP
  Ссылки в PHP
  PHP и ООП
  Безопасность
  Функции PHP
  Функции по категориям
  Функции по алфавиту
  Стандартные функции
  Пользовательские
  PHP и HTTP
  Работа с формами
  PHP и Upload
  PHP и Cookies
  PHP и базы данных
  PHP и MySQL
  Документация MySQL
  Учебники
  Учебники по PHP
  Учебники по MySQL
  Другие учебники
  Уроки PHP
  Введение
  Самые основы
  Управление
  Функции
  Документация
  Математика
  Файлы
  Основы SQL
  Дата и время
  CURL
  Изображения
  Стили
  Безопасность
  Установка
  Проектирование БД
  Регулярные выражения
  Подготовка к работе
  Быстрый старт
  Установка PHP
  Установка MySQL
  Конфигурация PHP
  Download / Скачать
  Скачать Apache
  Скачать PHP
  Скачать PECL
  Скачать PEAR
  Скачать MySQL
  Редакторы PHP
  Полезные утилиты
  Документация
  PHP скрипты
  Скачать скрипты
  Инструменты
  PHP в примерах
  Новости портала
 Главная   »  Функции PHP
 
 
Функции PHP » Функции обработки ошибок

set_error_handler

Версия: (PHP 4 >= 4.0.1, PHP 5, PHP 7)

set_error_handler - устанавливает пользовательский обработчик ошибок.

Синтаксис:

mixed set_error_handler (callable $error_handler [, int $error_types = E_ALL | E_STRICT ])

Параметры:

error_handler - Функция указанного ниже вида. Можно передать вместо нее NULL, для сброса обработчика в значение по умолчанию. Помимо имени функции, можно передать массив, содержащий объект и имя метода.

   bool handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] )
    errstr - Первый аргумента errno содержит уровень ошибки в виде целого числа.
    errfile - Второй аргумент errstr содержит сообщение об ошибке в виде строки.
    errline - Третий необязательный аргумент errfile содержит имя файла, в котором произошла ошибка, в виде строки.
    errcontext - Четвертый необязательный аргумент errline содержит номер строки, в которой произошла ошибка, в виде целого числа.
    error_types - Пятый необязательный аргумент errcontext содержит массив указателей на активную таблицу символов в точке, где произошла ошибка. Другими словами, errcontext будет содержать массив всех переменных, существующих в области видимости, где произошла ошибка. Пользовательский обработчик не должен изменять этот контекст.

    Если функция возвращает FALSE, управление передается встроенному обработчику ошибок.

error_handler - Может использоваться для задания маски, в соответствии с которой будет вызываться error_handler, по аналогии с ini настройкой error_reporting, которая отвечает за то, какие ошибки будут показаны в отчете. Без этой маски error_handler будет вызываться для обработки всех происходящих ошибок, вне зависимости от настроек в error_reporting.



Список изменений:

Версия Описание
5.5.0 error_handler теперь может принимать NULL.
5.2.0 Обработчик должен вернуть FALSE, чтобы заполнилось значение переменной $php_errormsg.

Описание

Задает пользовательскую функцию (error_handler), как обработчик ошибок в скрипте. Эта функция используется для определения собственного обработчика ошибок времени выполнения скрипта. Например, если требуется очистить данные/файлы, когда произошла критическая ошибка, или если нужно переключить тип ошибки, исходя из каких-то условий (используя функцию trigger_error()).

Важно помнить, что стандартный обработчик ошибок PHP не будет обрабатывать никакие типы ошибок, определенные в error_types, пока callback-функция не вернет FALSE. Пользовательский обработчик будет вызываться при любой ошибке, независимо от настроек, заданных функцией error_reporting(). Однако, вы можете прочитать текущее значение error_reporting и задать в обработчике соответствующие действия. В частности, это значение будет равно 0, если выражение, вызвавшее ошибку, начинается с оператора контроля ошибок @.

Также важно помнить, что на совести обработчика лежит вызов функции die() в случае необходимости. Если происходит возврат их обработчика ошибок, управление передается следующему выражению, стоящему за тем, что вызвало ошибку.

Ошибки следующих типов не могут быть обработаны пользователем: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, и большинство E_STRICT ошибок, произошедших в файле, где вызвана функция set_error_handler().

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

Возвращаемые значения

Возвращает строку содержащую предыдущий заданный обработчик ошибок (если есть). Если на данный момент используется встроенный обработчик, функция вернет NULL. В случае ошибки в работе самой функции, например, недопустимый обратный вызов, функция также вернет NULL. Если предыдущий определенный обработчик является методом класса, функция вернет массив содержащий имя класса и имя метода.

Примеры:

Пример 1 Обработка ошибок с помощью функций set_error_handler() и trigger_error()

PHP: скопировать код в буфер обмена
  1. // функция обработки ошибок
  2. function myErrorHandler($errno, $errstr, $errfile, $errline)
  3. {
  4.     if (!(error_reporting() & $errno)) {
  5.         // Этот код ошибки не включен в error_reporting
  6.         return;
  7.     }
  8.  
  9.     switch ($errno) {
  10.     case E_USER_ERROR:
  11.         echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
  12.         echo "  Фатальная ошибка в строке $errline файла $errfile";
  13.         echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
  14.         echo "Завершение работы...<br />\n";
  15.         exit(1);
  16.         break;
  17.  
  18.     case E_USER_WARNING:
  19.         echo "<b>My WARNING</b> [$errno] $errstr<br />\n";
  20.         break;
  21.  
  22.     case E_USER_NOTICE:
  23.         echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
  24.         break;
  25.  
  26.     default:
  27.         echo "Неизвестная ошибка: [$errno] $errstr<br />\n";
  28.         break;
  29.     }
  30.  
  31.     /* Не запускаем внутренний обработчик ошибок PHP */
  32.     return true;
  33. }
  34.  
  35. // функция для тестирования обработчика ошибок
  36. function scale_by_log($vect, $scale)
  37. {
  38.     if (!is_numeric($scale) || $scale <= 0) {
  39.         trigger_error("log(x) для x <= 0 не определен, вы используете: scale = $scale", E_USER_ERROR);
  40.     }
  41.  
  42.     if (!is_array($vect)) {
  43.         trigger_error("Некорректный входной вектор, пропущен массив значений", E_USER_WARNING);
  44.         return null;
  45.     }
  46.  
  47.     $temp = array();
  48.     foreach($vect as $pos => $value) {
  49.         if (!is_numeric($value)) {
  50.             trigger_error("Значение на позиции $pos не является числом, будет использован 0 (ноль)", E_USER_NOTICE);
  51.             $value = 0;
  52.         }
  53.         $temp[$pos] = log($scale) * $value;
  54.     }
  55.  
  56.     return $temp;
  57. }
  58.  
  59. // переключаемся на пользовательский обработчик
  60. $old_error_handler = set_error_handler("myErrorHandler");
  61.  
  62. // вызовем несколько ошибок, во-первых, определим массив с нечисловым элементом
  63. echo "vector a\n";
  64. $a = array(2, 3, "foo", 5.5, 43.3, 21.11);
  65. print_r($a);
  66.  
  67. // теперь создадим еще один массив
  68. echo "----\nvector b - a notice (b = log(PI) * a)\n";
  69. /* Значение на позиции $pos не является числом, будет использован 0 (ноль)*/
  70. $b = scale_by_log($a, M_PI);
  71. print_r($b);
  72.  
  73. // проблема, мы передаем строку вместо массива
  74. echo "----\nvector c - a warning\n";
  75. /* Некорректный входной вектор, пропущен массив значений */
  76. $c = scale_by_log("not array", 2.3);
  77. var_dump($c); // NULL
  78.  
  79. // критическая ошибка, логарифм от неположительного числа не определен
  80. echo "----\nvector d - fatal error\n";
  81. /* log(x) для x <= 0 не определен, вы используете: scale = $scale */
  82. $d = scale_by_log($a, -2.5);
  83. var_dump($d); // До сюда не доберемся никогда

Пример ниже демонстрирует обработку внутренних исключений путем вызова ошибок разных типов и их обработки пользовательской функцией:
  1.  
  2. vector a
  3. Array
  4. (
  5.     [0] => 2
  6.     [1] => 3
  7.     [2] => foo
  8.     [3] => 5.5
  9.     [4] => 43.3
  10.     [5] => 21.11
  11. )
  12. ----
  13. vector b - a notice (b = log(PI) * a)
  14. <b>My NOTICE</b> [1024]  Значение на позиции 2 не является числом, будет использован 0 (ноль)Array
  15. (
  16.     [0] => 2.2894597716988
  17.     [1] => 3.4341896575482
  18.     [2] => 0
  19.     [3] => 6.2960143721717
  20.     [4] => 49.566804057279
  21.     [5] => 24.165247890281
  22. )
  23. ----
  24. vector c - a warning
  25. <b>My WARNING</b> [512] Некорректный входной вектор, пропущен массив значенийNULL
  26. ----
  27. vector d - fatal error
  28. <b>My ERROR</b> [256] log(x) for x <= 0 is undefined, you used: scale = -2.5  Фатальная ошибка в строке 35 файла trigger_error.php, PHP 5.2.1 (FreeBSD)Завершение работы...

Важно помнить, что стандартный обработчик ошибок РНР полностью игнорируется. Установки error_reporting() не будут иметь эффекта, и ваш обработчик будет вызываться независимо - однако вы можете читать текущее значение из error_reporting и поступать соответственно. Особенно важно то, что это значение будет 0, если оператор, вызвавший ошибку, имел префикс @.

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


Смотрите также:

error_reporting() - Задает, какие ошибки PHP попадут в отчет
restore_error_handler() - восстанавливает предыдущую функцию обработчика ошибок.
trigger_error() - генерирует сообщение error/warning/notice пользовательского уровня.


 Функции по алфавиту 
   Содержание   
 Функции по категориям 

Есть еще вопросы или что-то непонятно - добро пожаловать на наш  форум портала PHP.SU 
 

 
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS