#10. 4 php Оператор управления ошибками (собака, @)
Primary tabs
Как было сказано ранее, типы отслеживаемых системой ошибок задаются директивой error_reporting
конфигурационнного файла php.ini. Также говорилось, что значение error_reporing
может быть локально установлено для текущего скрипта.
Независимо от текущего значения error_reporting
, можно отключить вывод сообщений об ошибках, генерируемых некоторым PHP-выражением, применив к этому выражению оператор @
:
<?php echo @$x; /*предупреждение об использовании неинициализированной переменной подавляется оператором @ */
Справедливы следующие утверждения, касающиеся данного оператора:
- Он отключает вывод сообщений как в окно браузера, так и в лог-файл;
- Начиная с версии PHP 8.0, сообщения о фатальных ошибках, вызывающих прерывание скрипта, не подавляются. Таким образм, результатом строк
<?php @trigger_error("Неустранимая ошибка", E_USER_ERROR); echo "Конец программы";
в PHP старых версий будет завершение работы скрипта без каких-либо оповещений. В версиях PHP 8.0 и выше будет выведено сообщение:
Fatal error: Неустранимая ошибка in /var/www/mysite/index.php on line 2
- Операндом может быть любое выражение, возвращающее некоторое значение. Нельзя использовать
@
перед конструкциямиif
,for
, перед определениями функций и т.д. — то есть перед тем, что не является выражением (не возвращает никакого значения) . Пример ошибочного использования:<?php @echo $x; //ошибка — "echo $x" не является выражением
- Нужно с аккуратностью использовать перед вызовом функции, так как при этом будет отключен контроль всех ошибок, возникающих как внутри этой функции, так и во всех вложенных в неё функциях и подключаемых файлах. Например:
<?php function foo() { bar(); } function bar() { trigger_error("Какое-то важное предупреждение, " . "которое будет проигнорировано", E_USER_WARNING); } @foo(); echo "Конец программы";
Результат:
Конец программы - Если зарегистрирован пользовательский обработчик ошибок, то он в любом случае будет вызван.
Замечание: Отключение обработки ошибок пользовательской функцией в старых версиях PHP (до PHP 8.0)
Для отключения диагностики ошибок пользовательским обработчиком в старых версиях можно было использовать тот факт, что на время выполнения оператора @
значение error_reporting
устанавливается равным 0
, и явно осуществлять выход из обработчика в этом случае:
<?php function my_handler($errno, $msg, $file, $line) { if (error_reporting() == 0) { return; } echo $msg; }
Начиная с PHP 8.0, на время выполнения оператора управления ошибками функция error_reportig()
, вызываемая внутри пользовательского обработчика ошибок, возвращает значение E_ALL | E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE
.
- Log in to post comments
- 658 reads