PHP-4 Эффективная работа


Категории ошибок РНР-машины
Функции подсистемы обработки ошибок

Народная мудрость гласит: «Если человек может сделать ошибку, он ее сделает. Если же вы полагаете, что ошибку в данной ситуации совершить невозможно, то вы ошибаетесь». Поэтому последние тридцать или сорок лет практически во всех языках программирования огромное внимание уделяется борьбе с различными ошибками. По некоторым оценкам, до 90% объема программного кода предназначено для обработки тех или иных нештатных ситуаций.

14.1. Категории ошибок РНР-машины

В РНР все типы ошибок и предупреждений разбиты на несколько категорий, которые приведены в табл. 14.1.

Таблица 11.1.Категории ошибок в РНР 4
Код Константа Описание
1E_ERROR Фатальная ошибка на этапе исполнения программы
2E_WARNING Предупреждение на этапе исполнения программы (нефатальная ошибка)
4E_PARSEОшибка во время компиляции программы
8E_NOTICEСообщения на этапе исполнения (менее серьезные, чем предупреждения)
16 E_CORE_ERROR Фатальные ошибки во время инициализации РНР-машины
32E_CORE_WARNINGПредупреждения (нефатальные ошибки) во время инициализации РНР-машины
64 E_COMPILE_ERROR Фатальная ошибка этапа компиляции
128 E_COMPILE_WARNINGПредупреждения (нефатальные ошибки) на этапе компиляции
256 E_USЕR_ERRORГенерируемое пользователем сообщение об ошибке
512 E_USER_WARNINGГенерируемое пользователем предупреждение
1024 E_USER_NOTICE Генерируемое пользователем сообщение
.E_ALLВсе вышеперечисленные категории

Приведенные в таблице значения как численных, так и символьных констант используются для построения битовых масок, определяющих, какие категории сообщений об ошибках могут генерироваться во время выполнения программы. Вы можете вполне традиционным способом использовать битовые операторы для включения или отключения определенных категорий.

Стандартное значение режима генерации сообщений равно E_ALL & ~Е_NОТIСЕ,что соответствует выводу всех сообщений, которые не относятся к категории E_NOTICE.

совет
       Это начальное значение может быть изменено в инициализационном файле php.ini с по- мощью директивы error_reporting, либо в конфигурационном файле Apache httpd.conf с помощью директивы php_error_reporting, либо, наконец, вы можете изменять его во время выполнения программы с помощью функции error_reporting() (см. раздел 14.2.2).

В тех случаях, когда вам приходится заниматься неблагодарной работой по переписыванию устаревших программ с РНР 3 на РНР 4, вам необходимо обязательно проверить значения активизированных категорий ошибок и обращений кеrrоr_rеporti ng() и отключить генерацию тех категорий, которые отсутствуют в РНР 3, например E_COMPILE_ERROR.

совет
       Обратите внимание на подсистему обработки ошибок в том случае, если запущенная вами программа возвращает пустой документ.

Следует также иметь в виду, что любые PHP-операторы и выражения могут активизироваться с префиксом @, который отключает работу подсистемы обработки ошибок при интерпретации этого оператора или выражения. Если же во время выполнения такого оператора ошибка произошла при активизированном режиме track_errors, то выполнение программы не прекратится, а вы сможете извлечь сообщение об ошибке из глобальной переменной $php_errormsg.

На сегодняшний день реализация префикса @ отключает генерацию даже критических ошибок времени исполнения программы, которые в любом случае приводят к аварийному завершению программы. Это означает, что если вы, например, используете @ для подавления ошибок, возникающих в некоторой функции, и при этом PHP-машина просто не сможет загрузить эту функцию1, то программа беззвучно «скончается», не выдав вам никакого сообщения о причинах останова.

14.2. Функции подсистемы обработки ошибок

Теперь мы можем приступить к детальному рассмотрению всех функций, связанных с обработкой ошибок.

14.2.1. Отправка сообщения об ошибке: errorjog

int error_log (string message, 1nt message_type
                            [, string destination[, string extra_headers]])

Отправляет сообщение об ошибке в журнал web-сервера, порт TCP или в файл. Первый аргумент функции message представляет собой текст сообщения об ошибке. Второй аргумент message_type определяет, куда будет направлено сообщение:

Предположим, вы попросту неправильно написали ее имя.
  0 Сообщение направляется в системный журнал PHP-машины посредством системного механизма поддержки журнала в соответствии с установками конфигурационной директивы error_log
  1 Сообщение отправляется по электронной почте. Адрес определяется аргументом destination. Это единственный тип сообщения, в котором используется четвертый аргумент функции — extra_headers. Функция использует те же механизмы PHP-машины, что и Mai 1 () (см. раздел 12.1.1)
  2 Сообщение отправляется через отладочный TCP-канал PHP-машины. Используется только в РНР 3. При переносе программы в версию РНР 4 вы должны убрать соответствующие строки
  3 Сообщение дописывается в конец файла, имя которого задано аргументом desti nation
Вот пример практического использования этой функции (см. также раздел 19.3, листинг 19.1).

Листинг 14.1. Отправка сообщения об ошибке: функция errorjog ()
// Отправляем сообщение в системный журнал при невозможности
// подключиться к базе данных
if (!Ora_Logon ($username, $password)) {
          error_log ("Подключиться к СУБД Oracle не удалось!", 0);
}
// Оповещаем администратора о невозможности выделения
// системой необходимых ресурсов
if (!($foo = allocate_new_foo()) {
          error_log ("У нас беда! Кончились все FOO-сики...", 1,
                             "operator@mydomain.com"); }
// А теперь отправим сообщение в собственный журнал
error_log ("Как же все запущено...", 3,
                    "/var/tmp/my-errors.log");

14.2.2. Настройка системного журнала:error_reporting

int error_reporting ([int level])

Эта функция устанавливает, какие категории сообщений об ошибках будут отправляться в системный журнал, и одновременно возвращает свое старое (предыдущее) значение. Аргумент функции может представлять собой либо битовую маску, либо именованную константу, соответствующую одной или сразу всем категориям сообщений. Коды категорий и соответствующие им константы приведены в табл. 14.1.

совет
       В связи с тем что добавление новых категорий в последующих версиях языка может осуществляться, мягко говоря, «по-разному», с целью обеспечения совместимости разрабатываемых вами программ рекомендуется использовать для обозначения категорий только константы.

А вот несколько полезных примеров использования функции error_reporting:
/* Отключение всех сообщений */
// Решение для отображения "стандартного набора" ошибок
error_reporting (7); // Старый синтаксис, РНР 2/3
error_reporting (E_ERROR | E_WARNING | E_PARSE);
                                        // Новый синтаксис РНР 3/4

// Решение для выявления неверно записанных имен переменных
// или попыток использования неинициализированных переменных
error_reporting (15); // Старый синтаксис, РНР 2/3
error_reporting (E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
                                        // Новый синтаксис РНР 3/4

// Генерация сообщений обо всех ошибках
error_reporting (63); // Старый синтаксис, РНР 2/3
error_reporting (E_ALL); , // Новый синтаксис РНР 3/4

назад
далее

Сайт управляется системой uCoz