set_error_handler Задаёт пользовательский обработчик ошибок &reftitle.description; mixedset_error_handler callableerror_handler interror_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;, для сброса обработчика в значение по умолчанию. Помимо имени функции, можно передать массив, содержащий объект и имя метода. boolhandler interrno stringerrstr stringerrfile interrline arrayerrcontext errno В первый аргумент 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.0 errno больше не 0, когда выражение было подавлено с помощью оператора управления ошибками @ 8.0.0 Параметр errcontext был удалён и больше не передаётся в пользовательскую функцию обработки ошибок. 7.2.0 Параметр errcontext объявлен устаревшим. Теперь при его использовании будет вызываться ошибка уровня E_DEPRECATED. &reftitle.examples; Обработка ошибок с помощью функций <function>set_error_handler</function> и <function>trigger_error</function> Пример ниже демонстрирует обработку внутренних исключений путём вызова ошибок разных типов и их обработки пользовательской функцией: Пользовательская ОШИБКА [$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; ErrorException error_reporting restore_error_handler trigger_error Константы уровней ошибок