#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
- 990 reads