set_error_handler
Задаёт пользовательский обработчик ошибок
&reftitle.description;
mixedset_error_handlercallableerror_handlerinterror_typesE_ALL | E_STRICT
Задаёт пользовательскую функцию (error_handler),
как обработчик ошибок в скрипте.
Эта функция используется для определения собственного обработчика ошибок
времени выполнения скрипта. Например, если требуется очистить данные/файлы,
когда произошла критическая ошибка, или если нужно переключить тип ошибки,
исходя из каких-то условий (используя функцию
trigger_error).
Важно помнить, что стандартный обработчик ошибок PHP не будет обрабатывать
никакие типы ошибок, определённые в error_types,
пока callback-функция не вернёт &false;. Пользовательский обработчик будет
вызываться при любой ошибке, независимо от настроек, заданных функцией
error_reporting.
До PHP 8.0.0 значение errno всегда было
0, если выражение, вызвавшее диагностику, было добавлено
с помощью оператора управления ошибками @.
Также важно помнить, что на совести обработчика лежит вызов функции
die в случае необходимости. Если происходит возврат
из обработчика ошибок, управление передаётся следующему выражению,
стоящему за тем, что вызвало ошибку.
Ошибки следующих типов не могут быть обработаны пользователем:
E_ERROR, E_PARSE,
E_CORE_ERROR, E_CORE_WARNING,
E_COMPILE_ERROR,
E_COMPILE_WARNING независимо от того, где они были сгенерированы и большинство
ошибок E_STRICT, произошедших в файле, где вызвана
функция set_error_handler.
Если ошибки возникают до запуска скрипта (например, пока файл загружается),
пользовательский обработчик не будет вызываться, если на этот момент он
ещё не зарегистрирован.
&reftitle.parameters;
error_handler
Функция указанного ниже вида.
Можно передать вместо неё &null;, для сброса обработчика в значение
по умолчанию. Помимо имени функции, можно передать массив, содержащий
объект и имя метода.
boolhandlerinterrnostringerrstrstringerrfileinterrlinearrayerrcontexterrno
В первый аргумент errno будет передан уровень
ошибки в виде целого числа.
errstr
Во второй аргумент errstr будет передано сообщение
об ошибке в виде строки.
errfile
Если функция обратного вызова принимает третий параметр
errfile, то в него будет передано
имя файла, в котором произошла ошибка, в виде строки.
errline
Если функция обратного вызова принимает четвёртый параметр
errline, то в него будет передан
номер строки, в которой произошла ошибка, в виде целого
числа.
errcontext
Если функция обратного вызова принимает пятый параметр
errcontext, то в него будет передан
массив указателей на активную таблицу символов в точке, где
произошла ошибка. Другими словами, errcontext
будет содержать массив всех переменных, существующих в области
видимости, где произошла ошибка. Пользовательские обработчики ошибок не
должны изменять этот контекст.
Этот параметр объявлен УСТАРЕВШИМ начиная с PHP 7.2.0 и
был УДАЛЁН в PHP 8.0.0. Если в вашей функции этот
параметр используется и для него не задано значение по умолчанию, то при
вызове функции обработчика будет выдана ошибка "too few arguments".
Если функция возвращает &false;, управление передаётся встроенному
обработчику ошибок.
error_types
Может использоваться для задания маски, в соответствии с которой будет
вызываться error_handler, по аналогии с
ini-настройкой error_reporting,
которая отвечает за то, какие ошибки будут показаны в отчёте. Без этой
маски error_handler будет вызываться для
обработки всех происходящих ошибок, вне зависимости от настроек в
error_reporting.
&reftitle.returnvalues;
Возвращает строку, содержащую предыдущий заданный обработчик ошибок (если
есть). Если на данный момент используется встроенный обработчик, функция
вернёт &null;. В случае ошибки в работе самой функции, например,
недопустимый обратный вызов, функция также вернёт &null;. Если предыдущий
определённый обработчик является методом класса, функция вернёт массив,
содержащий имя класса и имя метода.
&reftitle.changelog;
&Version;&Description;8.0.0errno больше не 0, когда
выражение было подавлено с помощью
оператора управления ошибками @
8.0.0
Параметр errcontext был удалён и больше не передаётся в
пользовательскую функцию обработки ошибок.
7.2.0
Параметр errcontext объявлен устаревшим. Теперь при его
использовании будет вызываться ошибка уровня E_DEPRECATED.
&reftitle.examples;
Обработка ошибок с помощью функций set_error_handler
и trigger_error
Пример ниже демонстрирует обработку внутренних исключений путём
вызова ошибок разных типов и их обработки пользовательской функцией:
Пользовательская ОШИБКА [$errno] $errstr \n";
echo " Фатальная ошибка в строке $errline файла $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ") \n";
echo "Завершение работы... \n";
exit(1);
case E_USER_WARNING:
echo "Пользовательское ПРЕДУПРЕЖДЕНИЕ [$errno] $errstr \n";
break;
case E_USER_NOTICE:
echo "Пользовательское УВЕДОМЛЕНИЕ [$errno] $errstr \n";
break;
default:
echo "Неизвестная ошибка: [$errno] $errstr \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); // До сюда не дойдём никогда
?>
]]>
&example.outputs.similar;
2
[1] => 3
[2] => foo
[3] => 5.5
[4] => 43.3
[5] => 21.11
)
----
vector b - a notice (b = log(PI) * a)
Пользовательское УВЕДОМЛЕНИЕ [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
Пользовательское ПРЕДУПРЕЖДЕНИЕ [512] Некорректный входной вектор, пропущен массив значений
NULL
----
vector d - fatal error
Пользовательская ОШИБКА [256] log(x) for x <= 0 is undefined, you used: scale = -2.5
Фатальная ошибка в строке 35 файла trigger_error.php, PHP 5.2.1 (FreeBSD)
Завершение работы...
]]>
&reftitle.seealso;
ErrorExceptionerror_reportingrestore_error_handlertrigger_errorКонстанты уровней ошибок