Устанавливает пользовательскую функцию (error_handler) для обработки ошибок в скрипте. Возвращает ранее определённый обработчик
ошибок (если имеется), FALSE при ошибке. Эта функция может использоваться для определения вашего
собственного способа обработки ошибок на этапе прогона, например, в
приложениях, в которых вам нужно зачистить данные/файлы при возникновении критических ошибок,
или если вам нужно переключить ошибку при определённых условиях (использую
trigger_error()).
Пользовательская функция должна принимать 2 параметра: error-код и строку
с описанием ошибки. Начиная с PHP 4.0.2, предоставляются дополнительные 3
параметра: имя файла, в котором появилась ошибка, номер строчки, в которой
появилась ошибка, и контекст, в котором появилась ошибка (массив, указывающий
на активную таблицу символов в точке возникновения ошибки).
Примечание:
следующие типы ошибок не могут быть обработаны пользовательской функцией: E_ERROR,
E_PARSE, E_CORE_ERROR, E_CORE_WARNING,
E_COMPILE_ERROR и E_COMPILE_WARNING.
Следующий пример показывает обработку внутренних исключений путём переключения ошибок и обработки их пользовательской функцией:
Пример 1.
Обработка ошибок с помощью set_error_handler() и
trigger_error()
<?php
// переопределить константы пользовательских ошибок - только PHP 4
define (FATAL,E_USER_ERROR);
define (ERROR,E_USER_WARNING);
define (WARNING,E_USER_NOTICE);
// установить уровень серьёзности ошибок для данного скрипта
error_reporting (FATAL | ERROR | WARNING);
// функция обработчика ошибок
function myErrorHandler ($errno, $errstr, $errfile, $errline) {
switch ($errno) {
case FATAL:
echo "<b>FATAL</b> [$errno] $errstr<br>
";
echo " Fatal error in line ".$errline." of file ".$errfile;
echo ", PHP ".PHP_VERSION." (".PHP_OS.")<br>
";
echo "Aborting...<br>
";
exit 1;
break;
case ERROR:
echo "<b>ERROR</b> [$errno] $errstr<br>
";
break;
case WARNING:
echo "<b>WARNING</b> [$errno] $errstr<br>
";
break;
default:
echo "Unkown error type: [$errno] $errstr<br>
";
break;
}
}
// функция для проверки обработки ошибок
function scale_by_log ($vect, $scale) {
if ( !is_numeric($scale) || $scale <= 0 )
trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale",
FATAL);
if (!is_array($vect)) {
trigger_error("Incorrect input vector, array of values expected", ERROR);
return null;
}
for ($i=0; $i<count($vect); $i++) {
if (!is_numeric($vect[$i]))
trigger_error("Value at position $i is not a number, using 0 (zero)",
WARNING);
$temp[$i] = log($scale) * $vect[$i];
}
return $temp;
}
// установить в пользовательский обработчик ошибок
$old_error_handler = set_error_handler("myErrorHandler");
// переключить некоторые ошибки; сначала определить смешанный
// массив с нецифровыми элементами
echo "vector a
";
$a = array(2,3,"foo",5.5,43.3,21.11);
print_r($a);
// теперь сгенерировать второй массив, генерируя предупреждение
echo "----
vector b - a warning (b = log(PI) * a)
";
$b = scale_by_log($a, M_PI);
print_r($b);
// это проблема, мы передаём строку вместо массива
echo "----
vector c - an error
";
$c = scale_by_log("not array",2.3);
var_dump($c);
// это критическая ошибка, log нуль или отрицательное число не определено
echo "----
vector d - fatal error
";
$d = scale_by_log($a, -2.5);
?>
А когда вы запустите это скрипт-сэмпл:
vector a
Array
(
[0] => 2
[1] => 3
[2] => foo
[3] => 5.5
[4] => 43.3
[5] => 21.11
)
----
vector b - a warning (b = log(PI) * a)
<b>WARNING</b> [1024] Value at position 2 is not a number, using 0 (zero)<br>
Array
(
[0] => 2.2894597716988
[1] => 3.4341896575482
[2] => 0
[3] => 6.2960143721717
[4] => 49.566804057279
[5] => 24.165247890281
)
----
vector c - an error
<b>ERROR</b> [512] Incorrect input vector, array of values expected<br>
NULL
----
vector d - fatal error
<b>FATAL</b> [256] log(x) for x <= 0 is undefined, you used: scale = -2.5<br>
Fatal error in line 36 of file trigger_error.php, PHP 4.0.2 (Linux)<br>
Aborting...<br>
Важно помнить, что стандартный обработчик ошибок РНР полностью игнорируется. Установки
error_reporting() не будут иметь эффекта, и ваш обработчик будет вызываться независимо - однако
вы можете читать текущее значение из error_reporting
и поступать соответственно. Особенно важно то, что это значение будет 0, если
оператор, вызвавший ошибку, имел префикс @.
Отметьте также, что вы отвечаете за die(), если это необходимо. Если возвращает функция обработки ошибок, выполнение
скрипта будет продолжено со следующего оператора после оператора, вызвавшего ошибку.