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() позволяет изменять конфигурационные настройки PHP, включая error_reporting.
ini_set('error_reporting', E_ALL);Постоянные настройки уровня отчетов можно задать в php.ini через директиву error_reporting.
; В файле php.ini
error_reporting = E_ALL & ~E_NOTICEЭти директивы управляют отображением ошибок на экране и логированием в файл соответственно. Часто используются вместе с 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 (отключены все ошибки)
Изменения через error_reporting() могут переопределяться настройками в php.ini, если не учитывать порядок инициализации.
// Потеря предыдущего уровня ошибок
$current = error_reporting(E_ALL); // Текущий уровень сохранен
error_reporting(E_ERROR); // Изменение уровня
error_reporting($current); // Восстановлениеerror_reporting(0); // Отключает все ошибки, что может скрыть критические проблемыИзменения в новых версиях PHP
Значение E_ALL изменилось с 32767 на 32759 в PHP 8.0, так как уровень E_STRICT включен в E_ALL. В PHP 8.1 значение E_ALL снова стало 32767.
Были добавлены новые типы ошибок, связанные с исключениями. Уровень E_STRICT был пересмотрен и частично включен в другие уровни ошибок.
Значение E_ALL было изменено с 30719 на 32767, включая E_STRICT в E_ALL по умолчанию в некоторых конфигурациях.
Расширенные примеры использования
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);
}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); // Не будет обработаноПерехваченная ошибка: Тестовое предупреждение
$old_error_level = error_reporting(0);
$result = file_get_contents('несуществующий_файл.txt');
error_reporting($old_error_level);
if ($result === false) {
echo "Файл не найден, но ошибка была подавлена";
}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(error_reporting()) {
case 0:
echo "Все ошибки отключены";
break;
case E_ALL:
echo "Включены все типы ошибок";
break;
default:
echo "Частичная настройка уровня ошибок";
}