Категории ошибок РНР-машины
Функции подсистемы обработки ошибок
14.2.3. Восстановление обработчика: restore_error_handler
void restore_error_handler ()
Эта функция используется после переустановки системного обработчика ошибок
с помощью вызова set_error_handler(). Ее назначение состоит в восстановлении ранее установленного обработчика, который может представлять собой как
встроенную (системную) функцию, так и пользовательский обработчик, который
был установлен ранее.
См.также error_reporting() (раздел 14.2.2),set_error_handler() (раздел 14.2.4),
trigger_error() (раздел 14.2.5) и user_error() (раздел 14.2.6).
14.2.4. Установка обработчика: set_error_handler
string set_error_handler (string error_hand1er)
Регистрирует в системе пользовательскую функцию обработчика ошибок, автоматически вызываемую при обнаружении ошибок в программе. Возвращает указатель на предыдущий обработчик, если такой был установлен ранее, или false
при ошибке в процессе регистрации. Эта функция может использоваться также
для автоматической очистки файловых буферов или аварийного завершения транзакций баз данных либо, совместно сtrigger_е rrоr (), для обработки ошибок, которые требуют выполнения каких-либо специальных действий.
Пользовательская функция обработчика ошибок должна иметь два параметра: код
ошибки и строку, содержащую описание ошибки. А начиная с версии РНР 4.0.2
поддерживается еще три необязательных (дополнительных) параметра: имя файла,
в котором произошла ошибка, номер строки с ошибкой в этом файле, а также контекст,
в котором зафиксирована ошибка. Последний параметр представляет собой массив,
который указывает на таблицу символов, активную в момент обнаружения ошибки.Последний параметр представляет собой массив,
который указывает на таблицу символов, активную в момент обнаружения ошибки.
В приведенном ниже примере демонстрируется перехват обслуживания внутренних
исключений за счет применения триггеров ошибок и пользовательского обработчика.
Листинг 14.2. Пользовательский обработчик ошибок
<HTML>
<ТIТLЕ>Попьзовательский обработчик ошибок</ТIТLЕ>
<BODY BGCOLOR="#FFFFFF">
<FONT SIZE=+1>
<?php
// Переопределение констант в соответствии с нашими
// предпочтениями - действует только в РНР 4
define (FATAL , E_USER_ERROR) ;
define (ERROR,E_USER_WARNING) ;
define (WARNING, E_USER_NOTICE) ;
// Задаем категории перехватываемых и обрабатываемых ошибок
error_reporting (FATAL | ERROR | WARNING);
// Функция обработки ошибок, генерирующая сообщения
// в HTML-формате
function myErrorHandler ($errno, $errstr, $errfile, $errline) {
switch ($errno) {
case FATAL:
echo "<FONT COLOR=\"red\"><b>KOШMAP</b>" ;
echo "</FONT>[$errno] $errstr<br>\n" ;
echo "Фатальная ошибка в строке ".$errline;
echo " файла ".$errfile;
echo ", PHP ".PHP_VERSION. " (" . PHP_OS. ")<br>" ;
echo "Аварийное завершение программы. .. <p>" ;
exit -1;
break;
case ERROR:
echo "<FONT COLOR=\"Blue\"><b»OШИБKA</b></FONT>" .
"[$errno] $errstr<p>";
break;
case WARNING:
echo "<FONT COLOR=\"GREEN\"><b>BHИMAHME</b></FONT>".
"[;errno] $errstr<p>";
break ;
default:
echo "Ошибка неизвестного типа: [;errno] $errstr<p>\n" ;
break;
}
}
// Небольшая функция, демонстрирующая работу
// механизма обработки ошибок
function scale_by_log ($vect, $scale) {
if ( ! is_numeric($scale) || $scale <= 0 )
trigger_error(" Функция log(x) не определена ".
"для x <= 0. <br>" .
"Введенный вами аргумент: scale = $scale", FATAL);
if (! is_array ($vect)) {
trigger_error (" Недопустимый входной вектор<br>".
"Необходимо использовать массив значений",ERROR) ;return null;
}
for ($i=0; $i<count($vect) ; Si++) {
if (!is_numeric($vect[$i]))
trigger_error ( " Значение в позиции <b>$i</b> ".
"не является числом. <br>Произведена ".
"замена на <b>0</b> (нуль)
WARNING) ;
$temp[$i] = log($scale) * $vect[$i] ;
}
return $temp;
}
// Переключаемся на пользовательский обработчик
$old_error_handler = set_error_handler ("myErrorHandler") ;
?>
Для начала создадим массив, в котором содержится смесь числовых и нечисловых значений. <р>
Исходный вектор: <b>
<?
$а = array(2.3,"foo",5.5.43.3.21.11);
print_r ($a) ;
Теперь создадим второй массив <b>b</b>,
генерируя при этом предупреждение при вычислении <b>(b = log(PI) * a)</b>.<p>
<?
$b = scale_by_log($a, M_PI);
print_r($b) ;
?>
<P>
А вот теперь возникает действительно серьезная ошибка - мы передаем вместо массива строку... <р>
<?
$с = scale_by_log("'этo строка, а не массив" , 2.3) ;
var_dump($c) ;
?>
- результат, возвращенный функцией <b>scale_by_log</b><p>
Впрочем, это еще не катастрофа. Действительно критическая
ошибка последует ниже - мы попытаемся вычислить логарифм от
отрицательного числа... <р>
<?
$d = scale_by_log($a, -2.5);
7 >
Результат выполнения этой программы представлен на рис. 14.1.
Необходимо иметь в виду, что при установке собственного обработчика стандартный механизм обработки ошибок PHP-машины полностью отключается и вся ответственность за корректную обработку ошибочных ситуаций ложится на вас. Установки функции error_reporting() никакого значения не имеют, и ваш обработчик
вызывается в любом случае, хотя вы по-прежнему можете анализировать значение error_reporting() и принимать решение в соответствии с ним.
Кроме того, вы должны иметь в виду, что вызов функции diе() в случае необходимости также должен выполняться вашим обработчиком. Если же функция обработчика завершает свою работу штатным образом, то выполнение программы будет продолжено со следующего оператора.
Рис. 14.1. Пользовательский обработчик ошибок позволяет без особого напряжения «украсить» жизнь пользователя
14.2.5. Генерация сообщения: trigger_error
void trigger_error (string error_msg [, int error_type])
Функция используется для активизации триггера, срабатывающего при наступлении некоторой ошибочной ситуации. Может использоваться совместно как со
встроенным обработчиком ошибок, так и с пользовательским (см. раздел 14.2.4).
Обслуживает только категории ошибок из семейства E_USER. По умолчанию используется категория E_USER_NOTICE.
Функция оказывается полезна в том случае, когда вам необходимо активизировать некоторый определенный набор операций при наступлении исключения во
время выполнения программы. Например:
if (assert ($divisor == 0))
trigger_error ("Хотела бы разделить на нуль, да не могу", E_USER_ERROR);
14.2.6. Генерация сообщения об ошибке: user_error
void user_error (string error_msg [, int error_type])
Эта функция является синонимом для функции trigger_errоr ().
|