Функции 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:
скопировать код в буфер обмена
// функция обработки ошибок function myErrorHandler($errno, $errstr, $errfile, $errline) { // Этот код ошибки не включен в error_reporting return; } switch ($errno) { case E_USER_ERROR: echo "<b>My ERROR</b> [$errno] $errstr<br />\n"; echo " Фатальная ошибка в строке $errline файла $errfile"; echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; echo "Завершение работы...<br />\n"; break; case E_USER_WARNING: echo "<b>My WARNING</b> [$errno] $errstr<br />\n"; break; case E_USER_NOTICE: echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; break; default: echo "Неизвестная ошибка: [$errno] $errstr<br />\n"; break; } /* Не запускаем внутренний обработчик ошибок PHP */ return true; } // функция для тестирования обработчика ошибок function scale_by_log($vect, $scale) { trigger_error("log(x) для x <= 0 не определен, вы используете: scale = $scale", E_USER_ERROR); } trigger_error("Некорректный входной вектор, пропущен массив значений", E_USER_WARNING); return null; } foreach($vect as $pos => $value) { trigger_error("Значение на позиции $pos не является числом, будет использован 0 (ноль)", E_USER_NOTICE); $value = 0; } $temp[$pos] = log($scale) * $value; } return $temp; } // переключаемся на пользовательский обработчик // вызовем несколько ошибок, во-первых, определим массив с нечисловым элементом echo "vector a\n"; $a = array(2, 3, "foo", 5 .5 , 43 .3 , 21 .11 ); // теперь создадим еще один массив echo "----\nvector b - a notice (b = log(PI) * a)\n"; /* Значение на позиции $pos не является числом, будет использован 0 (ноль)*/ $b = scale_by_log($a, M_PI); // проблема, мы передаем строку вместо массива echo "----\nvector c - a warning\n"; /* Некорректный входной вектор, пропущен массив значений */ $c = scale_by_log("not array", 2.3); // критическая ошибка, логарифм от неположительного числа не определен echo "----\nvector d - fatal error\n"; /* log(x) для x <= 0 не определен, вы используете: scale = $scale */ $d = scale_by_log($a, -2.5); var_dump($d); // До сюда не доберемся никогда
|
Пример ниже демонстрирует обработку внутренних исключений путем
вызова ошибок разных типов и их обработки пользовательской функцией:
vector a Array ( [0] => 2 [1] => 3 [2] => foo [3] => 5.5 [4] => 43.3 [5] => 21.11 ) ---- vector b - a notice (b = log(PI) * a) <b>My NOTICE</b> [1024] Значение на позиции 2 не является числом, будет использован 0 (ноль)Array ( [0] => 2.2894597716988 [1] => 3.4341896575482 [2] => 0 [3] => 6.2960143721717 [4] => 49.566804057279 [5] => 24.165247890281 ) ---- vector c - a warning <b>My WARNING</b> [512] Некорректный входной вектор, пропущен массив значенийNULL ---- vector d - fatal error <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(), если это необходимо. Если возвращает функция обработки ошибок, выполнение
скрипта будет продолжено со следующего оператора после оператора, вызвавшего ошибку.
|