array ( 0 => 'index.php', 1 => 'PHP Manual', ), 'head' => array ( 0 => 'UTF-8', 1 => 'ru', ), 'this' => array ( 0 => 'language.operators.errorcontrol.php', 1 => 'Управление ошибками', ), 'up' => array ( 0 => 'language.operators.php', 1 => 'Операторы', ), 'prev' => array ( 0 => 'language.operators.comparison.php', 1 => 'Сравнение', ), 'next' => array ( 0 => 'language.operators.execution.php', 1 => 'Исполнение', ), 'alternatives' => array ( ), 'source' => array ( 'lang' => 'ru', 'path' => 'language/operators/errorcontrol.xml', ), ); $setup["toc"] = $TOC; $setup["toc_deprecated"] = $TOC_DEPRECATED; $setup["parents"] = $PARENTS; manual_setup($setup); ?>
PHP поддерживает один оператор управления ошибками: знак @
.
В случае если он предшествует какому-либо выражению в PHP-коде, любые
сообщения об ошибках, генерируемые этим выражением, будут подавлены.
Если пользовательская функция обработчика ошибок установлена функцией set_error_handler(), она всё равно будет вызываться, даже если диагностика была подавлена.
До версии PHP 8.0.0 функция error_reporting(),
вызываемая внутри пользовательского обработчика ошибок,
всегда возвращала 0
, если ошибка была подавлена оператором @
.
Начиная с PHP 8.0.0 она возвращает значение этого (побитового) выражения:
E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE
.
Любое сообщение об ошибке, сгенерированное выражением,
доступно в элементе массива с ключом «message»
,
возвращаемого функцией error_get_last().
Результат этой функции будет меняться при каждой ошибке,
поэтому его необходимо проверить заранее.
<?php
/* Преднамеренная ошибка при работе с файлами */
$my_file = @file ('non_existent_file') or
die ("Ошибка при открытии файла: сообщение об ошибке было таким: '" . error_get_last()['message'] . "'");
// работает для любых выражений, а не только для функций
$value = @$cache[$key];
// В случае если ключа $key нет, сообщение об ошибке (notice) не будет отображено
Замечание: Оператор
@
работает только с выражениями. Есть простое правило: если что-то возвращает значение, значит, можно указать перед ним оператор@
. Например, можно указать оператор@
перед именем переменной, произвольной функцией, вызовом выражения include и т. д. При этом нельзя указывать этот оператор перед определением функции или класса, условными конструкциями, например:if
, foreach и т. д.
До PHP 8.0.0 оператор @
мог подавлять критические ошибки,
которые прерывали выполнение скрипта.
Например, добавление оператора @
к вызову несуществующей функции,
когда она недоступна или вызвана с опечаткой,
приведёт к прерыванию выполнения скрипта без указания причины.