## Оператор управления ошибками

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(). Результат функции изменяется при каждой ошибке, поэтому результат лучше проверить заранее.

Пример #1 Преднамеренная ошибка считывания файла

    <?php

    $my_file = @file('non_existent_file') or
        die("При открытии файла возникла ошибка: '" . error_get_last()['message'] . "'");

    ?>

Пример #2 Подавление ошибок в выражениях

    <?php

    // Оператор работает с каждым выражением, а не только с функциями
    $value = @$cache[$key];
    // Уведомление не отобразится, если массив не содержит ключ $key

    ?>

> Замечание: Оператор `@` работает только с выражениями. Простое эмпирическое правило: оператор `@` добавляют перед инструкциями, которые вычисляются как значение. Оператор `@` указывают перед названием переменной, произвольной функцией, вызовом выражения include и т. д. При этом нельзя указывать оператор перед определением функции или класса, условными конструкциями наподобие `if`, циклом `foreach` и другими инструкциями, которые не вычисляются как значение.

Внимание

До PHP 8.0.0 оператор `@` подавлял критические ошибки, которые прерывали выполнение скрипта. Скрипт завершал выполнение без указания причины, если оператор `@` указывали, например, перед вызовом функции, которую не определили, не импортировали или в названии которой допустили опечатку.

### Смотрите также

- error_reporting()
- Обработка ошибок и функции логирования

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open