|
В РНР есть несколько типов ошибок и предупреждений:
Таблица 15-1. Типы ошибок PHP
Значение |
Константа |
Описание |
Примечание |
1 |
E_ERROR |
фатальные ошибки времени выполнения |
|
2 |
E_WARNING |
предупреждения времени выполнения (нефатальные ошибки) |
|
4 |
E_PARSE |
ошибки разбора времени компиляции |
|
8 |
E_NOTICE |
уведомления времени выполнения (менее серьёзные, чем предупреждения) |
|
16 |
E_CORE_ERROR |
фатальные ошибки при начальном старте PHP |
только PHP 4 |
32 |
E_CORE_WARNING |
предупреждения (нефатальные ошибки) при начальном старте РНР |
только PHP 4 |
64 |
E_COMPILE_ERROR |
фатальные ошибки времени компиляции |
только PHP 4 |
128 |
E_COMPILE_WARNING |
предупреждения времени компиляции (нефатальные ошибки) |
только PHP 4 |
256 |
E_USER_ERROR |
генерируемое пользователем сообщение об ошибке |
только PHP 4 |
512 |
E_USER_WARNING |
генерируемое пользователем предупреждение |
только PHP 4 |
1024 |
E_USER_NOTICE |
генерируемое пользователем уведомление |
только PHP 4 |
|
E_ALL |
всё вышеуказанное, как поддерживаемое |
|
Вышеуказанные значения (цифровые или символьные) используются для построения
битовой маски, которая специфицирует выводимое сообщение об ошибке. Вы можете
использовать битовые
операции для маскирования определённых типов ошибок. Обратите внимание,
что только '|', '~', '!' и '&' будут понятны в php.ini и что никакие битовые
операции не будут понятны в php3.ini.
В PHP 4 значением по умолчанию для error_reporting
будет E_ALL & ~E_NOTICE, что означает отображение всех ошибок и предупреждений, которые не имеют
уровень E_NOTICE-level. В PHP 3 значение по умолчанию (E_ERROR | E_WARNING | E_PARSE)
означает то же самое. Заметьте, однако, что, поскольку константы не поддерживаются в PHP 3 в файле
php3.ini, установка error_reporting
должна выполняться цифрами; то есть 7 по умолчанию.
Начальное значение может быть изменено в ini-файле директивой
error_reporting, в вашем Apache httpd.conf-файле директивой
php_error_reporting (php3_error_reporting для PHP 3) и, наконец, оно может
быть установлено на этапе прогона скрипта функцией
error_reporting()
.
Предупреждение! |
При обновлении кода или серверов с PHP 3 до PHP 4 вы должны проверить эти установки и вызовы
error_reporting()
, либо можете отключить
вывод сообщений о новых типах ошибок, особенно о E_COMPILE_ERROR.
Это может привести к появлению пустых документов без какого-либо сообщения о причине и месте возникновения проблемы.
|
Все выражения РНР могут
также вызываться с префиксом "@", который отключает сообщения об ошибках для
данного конкретного выражения. Если ошибка возникает в ходе вычисления такого выражения и
track_errors включена,
вы можете найти сообщение об ошибке в глобальной переменной $php_errormsg.
Примечание: префикс @ error-control-операции
не отключает вывод сообщений, которые являются результатом ошибок разбора.
Предупреждение! |
В настоящее время префикс @ error-control-операции
отключает даже сообщения о критических ошибках, которые прерывают выполнение
скрипта. Помимо прочего, это означает, что, если вы используете
@ для подавления ошибок из определённой
функции и она недоступна или неправильно написана, скрипт накроется без указания причины.
|
Ниже дан пример использования возможностей РНР по обработке ошибок. Мы
определяем функцию обработки ошибок, которая записывает лог-информацию в файл (используя XML-формат)
и уведомляет разработчика по e-mail при возникновении критической ошибки в логике.
Пример 15-1. Обработка ошибок в скриптах
<?php
// делаем нашу собственную обработку ошибок
error_reporting(0);
// пользовательская функция обработки ошибок
function userErrorHandler ($errno, $errmsg, $filename, $linenum, $vars) {
// штамп времени для вхождения ошибки
$dt = date("Y-m-d H:i:s (T)");
// определяем ассоциативный массив строки ошибки;
// в реальности мы должны рассматривать только
// 2,8,256,512 и 1024
$errortype = array (
1 => "Error",
2 => "Warning!",
4 => "Parsing Error",
8 => "Notice",
16 => "Core Error",
32 => "Core Warning!",
64 => "Compile Error",
128 => "Compile Warning!",
256 => "User Error",
512 => "User Warning!",
1024=> "User Notice"
);
// установить ошибки, для которых vartrace будет сохраняться
$user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);
$err = "<errorentry>\n";
$err .= "\t<datetime>".$dt."</datetime>\n";
$err .= "\t<errornum>".$errno."</errornum>\n";
$err .= "\t<errortype>".$errortype[$errno]."</errortype>\n";
$err .= "\t<errormsg>".$errmsg."</errormsg>\n";
$err .= "\t<scriptname>".$filename."</scriptname>\n";
$err .= "\t<scriptlinenum>".$linenum."</scriptlinenum>\n";
if (in_array($errno, $user_errors))
$err .= "\t<vartrace>".wddx_serialize_value($vars,"Variables")."</vartrace>\n";
$err .= "</errorentry>\n\n";
// для тестирования
// echo $err;
// сохранить в error log и e-mail, если имеется критическая пользовательская ошибка
error_log($err, 3, "/usr/local/php4/error.log");
if ($errno == E_USER_ERROR)
mail("phpdev@example.com","Critical User Error",$err);
}
function distance ($vect1, $vect2) {
if (!is_array($vect1) || !is_array($vect2)) {
trigger_error("Incorrect parameters, arrays expected", E_USER_ERROR);
return NULL;
}
if (count($vect1) != count($vect2)) {
trigger_error("Vectors need to be of the same size", E_USER_ERROR);
return NULL;
}
for ($i=0; $i<count($vect1); $i++) {
$c1 = $vect1[$i]; $c2 = $vect2[$i];
$d = 0.0;
if (!is_numeric($c1)) {
trigger_error("Coordinate $i in vector 1 is not a number, using zero",
E_USER_WARNING);
$c1 = 0.0;
}
if (!is_numeric($c2)) {
trigger_error("Coordinate $i in vector 2 is not a number, using zero",
E_USER_WARNING);
$c2 = 0.0;
}
$d += $c2*$c2 - $c1*$c1;
}
return sqrt($d);
}
$old_error_handler = set_error_handler("userErrorHandler");
// неопределённая константа, генерируется предупреждение
$t = I_AM_NOT_DEFINED;
// определяем некоторые "векторы"
$a = array(2,3,"foo");
$b = array(5.5, 4.3, -1.6);
$c = array (1,-3);
// генерируется пользовательская ошибка
$t1 = distance($c,$b)."\n";
// генерируется ещё одна пользовательская ошибка
$t2 = distance($b,"i am not an array")."\n";
// генерируется предупреждение
$t3 = distance($a,$b)."\n";
?>
|
|
Это лишь простой пример, показывающий, как использовать
Функции обработки ошибок и логинга.
См. также
error_reporting()
,
error_log()
,
set_error_handler()
,
restore_error_handler()
,
trigger_error()
,
user_error()
|
|