|
В РНР есть несколько типов ошибок и предупреждений: Таблица 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() |
|