Учебное пособие: Обработка ошибок в коде программ РНР

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

1.5 ОПЕРАТОР ОТКЛЮЧЕНИЯ ОШИБОК

Есть и еще один аргумент в пользу того, чтобы всегда включать полный контроль ошибок. Это — существование в РНР оператора @. Если этот оператор поставить перед любым выражением, то все ошибки, которые там возникнут, будут проигнорированы.

Если в выражении используется результат работы функции, из которой вызывается другая функция и т. д., то предупреждения будут заблокированы для каждой из них. Поэтому осторожно применяйте @.

Например:

if (!@filemtime("notextst.txt") )

echo "Файл не существует!";

Попробуйте убрать оператор @ — тут же получите сообщение: "Файл не найден", а только после этого — вывод оператора echo. Однако с оператором @ предупреждение будет подавлено, что и требовалось.

В приведенном примере, возможно, несколько логичнее было бы воспользоваться функцией file_exists(), которая как раз и предназначена для определения факта существования файла, но в некоторых ситуациях это не подойдет. Например:

//Обновить файл, если он не существует или очень старый

if ( ! file_exists($fname) || filemtime ($fname) <time () -60*60)

myFunctionForUpdateFile($fname);

Сравните со следующим фрагментом:

// Обновить файл, если он не существует или очень старый

if (@filemtime($fname)<time()-60*60)

myFunctionForUpdateFile($fname);

Всегда помните об операторе @. Он удобен. Рекомендуется не рисковать, задавая слабый контроль ошибок при помощи функции error_reporting(), если такой контроль и так можно локально установить при помощи оператора @?

Оператор отключения ошибок @ ценен еще и тем, что он блокирует не только вывод ошибок в браузер, но также и в log-файл. Пример из листинга 1.1 иллюстрирует ситуацию.

Листинг 1.1. Файл er.php

<?php ## Отключение ошибок: логи не модифицируются.

error_reporting(E_ALL);

ini_set("error_log", "log.txt");

ini_set("log_errors", true);

@filemtime("spoon");

?>

Запустив приведенный скрипт, вы заметите, что файл журнала log.txt даже не создался. Попробуйте теперь убрать оператор @ — вы- получите предупреждение "stat failed for spoon", и оно же запишется в log.txt.

1.5.1 ПРИМЕР ИСПОЛЬЗОВАНИЯ ОПЕРАТОРА @

Пусть имеется форма с submit-кнопкой, и нужно в сценарии определить, нажата ли она. Можно сделать это так:

<?php

if (!empty($submit)) echo "Кнопканажата!";

К-во Просмотров: 381
Бесплатно скачать Учебное пособие: Обработка ошибок в коде программ РНР