РНР 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, будут в любом случае обрабатываться встроенными средствами РНР, а не предыдущей установленной функцией-перехватчиком! |
| |
|
В начало ←предыдущая следующая→ ... 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 ... | ||