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