(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)
set_error_handler — Задаёт пользовательский обработчик ошибок
Задаёт пользовательскую функцию (callback
),
как обработчик ошибок в скрипте.
Функция может быть использована для определения пользовательских обработчиков ошибок во время выполнения, например, в приложениях, которые должны выполнять очистку файлов/данных в случае возникновения критической ошибки или при инициировании ошибки в ответ на определённые условия (используя функцию trigger_error()).
Важно помнить, что стандартный обработчик ошибок PHP не будет обрабатывать
никакие типы ошибок, определённые в error_levels
,
пока callback-функция не вернёт false
. Пользовательский обработчик будет
вызываться в случае возникновения любой ошибки, независимо от настроек, заданных функцией
error_reporting.
Также обратите внимание, что обработчик обязан при необходимости остановить выполнение скрипта, вызвав функцию exit(). Если происходит возврат из обработчика ошибок, управление передаётся следующему выражению, стоящему за тем, что вызвало ошибку.
Ошибки следующих типов не могут быть обработаны пользователем:
E_ERROR
, E_PARSE
,
E_CORE_ERROR
, E_CORE_WARNING
,
E_COMPILE_ERROR
,
E_COMPILE_WARNING
независимо от того, где они были сгенерированы и большинство
ошибок E_STRICT
, произошедших в файле, где вызвана
функция set_error_handler().
Если ошибки возникают до запуска скрипта (например, пока файл загружается), пользовательский обработчик не будет вызываться, если на этот момент он ещё не зарегистрирован.
callback
Если передано значение null
, обработчик сбрасывается в состояние по умолчанию.
В противном случае обработчик представляет собой callback-функцию со следующей сигнатурой:
$errno
,$errstr
,$errfile
= ?,$errline
= ?,$errcontext
= ?errno
errno
будет передан уровень
ошибки в виде целого числа.
errstr
errstr
будет передано сообщение
об ошибке в виде строки.
errfile
errfile
, то в него будет передано
имя файла, в котором произошла ошибка, в виде строки.
errline
errline
, то в него будет передан
номер строки, в которой произошла ошибка, в виде целого
числа.
errcontext
errcontext
, то в него будет передан
массив указателей на активную таблицу символов в точке, где
произошла ошибка. Другими словами, errcontext
будет содержать массив всех переменных, существующих в области
видимости, где произошла ошибка. Пользовательские обработчики ошибок не
должны изменять этот контекст.
Этот параметр объявлен УСТАРЕВШИМ начиная с PHP 7.2.0 и был УДАЛЁН в PHP 8.0.0. Если в вашей функции этот параметр используется и для него не задано значение по умолчанию, то при вызове функции обработчика будет выдана ошибка "too few arguments".
Если функция возвращает false
, управление передаётся встроенному
обработчику ошибок.
error_levels
Может использоваться для задания маски, в соответствии с которой будет
вызываться callback
, по аналогии с
ini-настройкой error_reporting,
которая отвечает за то, какие ошибки будут показаны в отчёте. Без этой
маски callback
будет вызываться для
обработки всех происходящих ошибок, вне зависимости от настроек в
error_reporting.
Возвращает ранее определённый обработчик ошибок (если есть) Если на данный момент используется встроенный обработчик, функция
вернёт null
. Если предыдущий определённый обработчик является методом класса, функция вернёт массив,
содержащий имя класса и имя метода.
Версия | Описание |
---|---|
8.0.0 |
Параметр errcontext был удалён и больше не передаётся в
пользовательскую функцию обработки ошибок.
|
7.2.0 |
Параметр errcontext объявлен устаревшим. Теперь при его
использовании будет вызываться ошибка уровня E_DEPRECATED .
|
Пример #1 Обработка ошибок с помощью функций set_error_handler() и trigger_error()
Пример ниже демонстрирует обработку внутренних исключений путём вызова ошибок разных типов и их обработки пользовательской функцией:
<?php
// функция обработки ошибок
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
if (!(error_reporting() & $errno)) {
// Этот код ошибки не включён в error_reporting,
// так что пусть обрабатываются стандартным обработчиком ошибок PHP
return false;
}
// может потребоваться экранирование $errstr:
$errstr = htmlspecialchars($errstr);
switch ($errno) {
case E_USER_ERROR:
echo "<b>Пользовательская ОШИБКА</b> [$errno] $errstr<br />\n";
echo " Фатальная ошибка в строке $errline файла $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
echo "Завершение работы...<br />\n";
exit(1);
case E_USER_WARNING:
echo "<b>Пользовательское ПРЕДУПРЕЖДЕНИЕ</b> [$errno] $errstr<br />\n";
break;
case E_USER_NOTICE:
echo "<b>Пользовательское УВЕДОМЛЕНИЕ</b> [$errno] $errstr<br />\n";
break;
default:
echo "Неизвестная ошибка: [$errno] $errstr<br />\n";
break;
}
/* Не запускаем внутренний обработчик ошибок PHP */
return true;
}
// функция для тестирования обработчика ошибок
function scale_by_log($vect, $scale)
{
if (!is_numeric($scale) || $scale <= 0) {
trigger_error("log(x) для x <= 0 не определён, вы используете: scale = $scale", E_USER_ERROR);
}
if (!is_array($vect)) {
trigger_error("Некорректный входной вектор, пропущен массив значений", E_USER_WARNING);
return null;
}
$temp = array();
foreach($vect as $pos => $value) {
if (!is_numeric($value)) {
trigger_error("Значение на позиции $pos не является числом, будет использован 0 (ноль)", E_USER_NOTICE);
$value = 0;
}
$temp[$pos] = log($scale) * $value;
}
return $temp;
}
// переключаемся на пользовательский обработчик
$old_error_handler = set_error_handler("myErrorHandler");
// вызовем несколько ошибок, во-первых, определим массив с нечисловым элементом
echo "vector a\n";
$a = array(2, 3, "foo", 5.5, 43.3, 21.11);
print_r($a);
// теперь создадим ещё один массив
echo "----\nvector b - a notice (b = log(PI) * a)\n";
/* Значение на позиции $pos не является числом, будет использован 0 (ноль)*/
$b = scale_by_log($a, M_PI);
print_r($b);
// проблема, мы передаём строку вместо массива
echo "----\nvector c - a warning\n";
/* Некорректный входной вектор, пропущен массив значений */
$c = scale_by_log("not array", 2.3);
var_dump($c); // NULL
// критическая ошибка, логарифм от неположительного числа не определён
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>Пользовательское УВЕДОМЛЕНИЕ</b> [1024] Значение на позиции 2 не является числом, будет использован 0 (ноль)<br /> Array ( [0] => 2.2894597716988 [1] => 3.4341896575482 [2] => 0 [3] => 6.2960143721717 [4] => 49.566804057279 [5] => 24.165247890281 ) ---- vector c - a warning <b>Пользовательское ПРЕДУПРЕЖДЕНИЕ</b> [512] Некорректный входной вектор, пропущен массив значений<br /> NULL ---- vector d - fatal error <b>Пользовательская ОШИБКА</b> [256] log(x) for x <= 0 is undefined, you used: scale = -2.5<br /> Фатальная ошибка в строке 35 файла trigger_error.php, PHP 5.2.1 (FreeBSD)<br /> Завершение работы...<br />