РНР 5 в подлиннике

Страница 216 из 554


Гпава 23. Управление интерпретатором

437

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

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

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

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.

Пример использования оператора @

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

<?рпр

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

Но, согласитесь, код листинга 23.9 элегантнее.

| Листинг 23.9. Файл submit.php

<?php ## Удобство оператора @.

if (@$_REQUEST['submit']) echo "Кнопка нажата!" ?>

<form action="<?=$_SERVER['SCRIPT_NAME']?>"> <input type="submit" name="submit" value="Go!"> </form>

Предостережения

Оператор @, как и любой мощный инструмент (вроде бензопилы), следует применять с осторожностью — иначе можно сильно пострадать (попасть в травмпункт). Например, следующий код никуда не годится — постарайтесь не повторять его в своих программах!

// Не подавляйте сообщения об ошибках во включаемых файлах — иначе // отладка превратится в кромешный ад! @include "mistake.php";

438

Часть IV. Стандартные функции РНР

//Не используйте оператор @ перед функциями, написанными на РНР, если только // нет 100%-й уверенности в том, что они работают корректно в любой ситуации! @myOwnBigFunction();

Итак, вот несколько рекомендаций, в каких случаях применение оператора подавления ошибок оправдано и более-менее безопасно:

□ в конструкциях if (@$_request[ ' key1 ]) для проверки существования (и ненулевого значения) элемента массива;

□ Перед стандартными функциями РНР вроде fopen(), filemtime (J, mysql_connect ()

и т. д., если далее идет проверка кода возврата и вывод сообщения об ошибке;

□ в HTML-файлах со вставками PHP-кода, если очень лень писать много кавычек: <?=@$resuit [element] [field] ?> (такой вызов не породит ошибок, несмотря на отсутствие кавычек).

Во всех остальных случаях лучше несколько раз подумать, прежде чем применять оператор @. Чем меньше область кода, в которой он будет действовать, тем более надежной окажется программа. Потому-то мы и не рекомендуем использовать @ перед include — это заблокирует проверку ошибок для очень большого фрагмента программы.

Перехват ошибок

В РНР версии 5 существуют два метода перехвата ошибок во время выполнения программы: механизм исключений и регистрация обработчика ошибки. Про исключения мы поговорим в части Vкниги, посвященной объектно-ориентированному программированию. А пока займемся обработчиками.

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

Примечание J

Необходимо обратить внимание на то, что метод перехвата ошибок при помощи пользовательских функций далек от совершенства. Действительно, сделать с сообщением что-либо разумное, кроме как записать его куда-нибудь и завершить программу (при необходимости), вряд ли представляется возможным. Метод исключений полностью лишен этого недостатка, но он довольно сложен и, к тому же, практически не реализован на уровне стандартных функций РНР (в отличие от таких языков, как, например, Python или Java, стандартные функции РНР почти никогда не генерируют исключений). Мы вернемся к этой теме позже, в гл. 34.

string set_error_handler (string $funcName [, int $errorTypes])

Регистрирует пользовательский обработчик ошибок — функцию, которая будет вызвана при возникновении сообщений, указанных в $errorTypes типов (битовая маска, например, e_all&~e_notice).

Внимание!

Сообщения, не соответствующие маске $ error Types, будут в любом случае обрабатываться встроенными средствами РНР, а не предыдущей установленной функцией-перехватчиком!




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006