Error reporting: примеры (PHP)

Функция error_reporting в PHP: полный обзор
Раздел: Обработка ошибок
error_reporting(?int $error_level = null): int

Функция error_reporting в PHP

Функция error_reporting() управляет уровнем отчетов об ошибках в PHP. Она устанавливает директиву error_reporting во время выполнения скрипта. Функция используется для определения того, какие типы ошибок PHP будут обрабатываться и отображаться.

Когда применяется функция

Функция применяется в следующих случаях: для отладки кода, временного изменения уровня отчетов в определенном участке программы, отключения некритичных уведомлений в продакшн-среде.

Аргументы функции

Функция принимает один необязательный аргумент:

  • $level (int) - битовая маска или именованная константа, определяющая уровень отчетов. Если аргумент не передан, функция возвращает текущий уровень.
Константы уровней ошибок
  • E_ERROR (1) - Критические ошибки выполнения
  • E_WARNING (2) - Предупреждения (некритические ошибки)
  • E_PARSE (4) - Ошибки синтаксического анализа
  • E_NOTICE (8) - Уведомления
  • E_CORE_ERROR (16) - Критические ошибки при старте PHP
  • E_CORE_WARNING (32) - Предупреждения при старте PHP
  • E_COMPILE_ERROR (64) - Критические ошибки компиляции
  • E_COMPILE_WARNING (128) - Предупреждения компиляции
  • E_USER_ERROR (256) - Пользовательские критические ошибки
  • E_USER_WARNING (512) - Пользовательские предупреждения
  • E_USER_NOTICE (1024) - Пользовательские уведомления
  • E_STRICT (2048) - Рекомендации по совместимости
  • E_RECOVERABLE_ERROR (4096) - Уловимые критические ошибки
  • E_DEPRECATED (8192) - Уведомления об устаревшем коде
  • E_USER_DEPRECATED (16384) - Пользовательские уведомления об устаревшем коде
  • E_ALL (32767) - Все ошибки и предупреждения (в PHP 8.1)

Примеры применения error_reporting

Установка уровня ошибок

Задание уровня с помощью константы:

error_reporting(E_ERROR);
// Теперь будут обрабатываться только критические ошибки
Получение текущего уровня
$current = error_reporting();
echo "Текущий уровень: $current";
Текущий уровень: 32767
Использование битовых операций

Включение всех ошибок кроме предупреждений:

error_reporting(E_ALL & ~E_WARNING);

Включение только критических и пользовательских ошибок:

error_reporting(E_ERROR | E_USER_ERROR);
Временное изменение уровня
$old_level = error_reporting(E_ALL);
// Код, требующий детальной отладки
error_reporting($old_level); // Возврат к предыдущему уровню

Альтернативные методы в PHP

ini_set() для error_reporting

Функция ini_set() позволяет изменять конфигурационные настройки PHP, включая error_reporting.

ini_set('error_reporting', E_ALL);
Конфигурационный файл php.ini

Постоянные настройки уровня отчетов можно задать в php.ini через директиву error_reporting.

; В файле php.ini
error_reporting = E_ALL & ~E_NOTICE
display_errors и log_errors

Эти директивы управляют отображением ошибок на экране и логированием в файл соответственно. Часто используются вместе с error_reporting для полного контроля обработки ошибок.

Пользовательские обработчики ошибок

Функции set_error_handler() и set_exception_handler() позволяют перехватывать ошибки и исключения для кастомной обработки.

Аналоги в других языках программирования

Error reporting в Python

В Python используется модуль logging для управления уровнем логирования.

import logging
logging.basicConfig(level=logging.WARNING)
logging.warning('Предупреждение')
logging.info('Информация')  # Не будет выведено
WARNING:root:Предупреждение

Error reporting в Javascript

В браузерном JavaScript используются console методы с разными уровнями.

console.error('Ошибка');
console.warn('Предупреждение');
console.log('Информация');

Error reporting в MySQL

В MySQL ошибки обрабатываются через механизм обработчиков и условия.

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
    SELECT 'Произошла ошибка' AS message;
END;

Error reporting в Java

В Java используется система логгирования с уровнями от SEVERE до FINEST.

Logger logger = Logger.getLogger("MyLogger");
logger.setLevel(Level.WARNING);

Распространенные ошибки

Неправильное использование битовых операторов
// Неправильно: использование вместо побитовых логических операторов
error_reporting(E_ALL && ~E_NOTICE); // Всегда возвращает false (0)
Уровень ошибок установлен в 0 (отключены все ошибки)
Конфликт с настройками php.ini

Изменения через error_reporting() могут переопределяться настройками в php.ini, если не учитывать порядок инициализации.

Игнорирование возвращаемого значения
// Потеря предыдущего уровня ошибок
$current = error_reporting(E_ALL); // Текущий уровень сохранен
error_reporting(E_ERROR); // Изменение уровня
error_reporting($current); // Восстановление
Ошибочное отключение важных ошибок
error_reporting(0); // Отключает все ошибки, что может скрыть критические проблемы

Изменения в новых версиях PHP

PHP 8.0

Значение E_ALL изменилось с 32767 на 32759 в PHP 8.0, так как уровень E_STRICT включен в E_ALL. В PHP 8.1 значение E_ALL снова стало 32767.

PHP 7.0

Были добавлены новые типы ошибок, связанные с исключениями. Уровень E_STRICT был пересмотрен и частично включен в другие уровни ошибок.

PHP 5.4

Значение E_ALL было изменено с 30719 на 32767, включая E_STRICT в E_ALL по умолчанию в некоторых конфигурациях.

Расширенные примеры использования

Динамическое управление ошибками по условию
Пример php
if ($_SERVER['SERVER_NAME'] === 'localhost') {
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
} else {
    error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
    ini_set('display_errors', 0);
}
Совместное использование с пользовательским обработчиком
Пример php
set_error_handler(function($errno, $errstr) {
    if (!(error_reporting() & $errno)) {
        return false; // Пропустить ошибку, если уровень не включен
    }
    // Кастомная обработка ошибки
    echo "Перехваченная ошибка: $errstr";
    return true;
});

error_reporting(E_USER_ERROR | E_USER_WARNING);
trigger_error("Тестовое предупреждение", E_USER_WARNING);
trigger_error("Тестовое уведомление", E_USER_NOTICE); // Не будет обработано
Перехваченная ошибка: Тестовое предупреждение
Временное подавление ошибок
Пример php
$old_error_level = error_reporting(0);
$result = file_get_contents('несуществующий_файл.txt');
error_reporting($old_error_level);
if ($result === false) {
    echo "Файл не найден, но ошибка была подавлена";
}
Контекстно-зависимые настройки отчетов
Пример php
class Debugger {
    private static $original_level;
    
    public static function enableVerbose() {
        self::$original_level = error_reporting();
        error_reporting(E_ALL);
        ini_set('display_errors', 1);
    }
    
    public static function restore() {
        error_reporting(self::$original_level);
        ini_set('display_errors', 0);
    }
}

Debugger::enableVerbose();
// Отладочный код
Debugger::restore();
Обработка различных уровней в switch
Пример php
switch(error_reporting()) {
    case 0:
        echo "Все ошибки отключены";
        break;
    case E_ALL:
        echo "Включены все типы ошибок";
        break;
    default:
        echo "Частичная настройка уровня ошибок";
}

PHP error_reporting function comments

En
Error reporting Sets which PHP errors are reported