Блог Горошко Андрея 1C-Битрикс Обработка ошибок и исключений в D7: Класс Bitrix\Main\Diag\ExceptionHandler и SystemException

Обработка ошибок и исключений в D7: Класс Bitrix\Main\Diag\ExceptionHandler и SystemException

Средний рейтинг
Еще нет оценок

Старый подход «вернуть false и записать ошибку в LAST_ERROR» уходит в прошлое. В D7 используется механизм исключений (Exceptions), который делает код более надежным и предсказуемым.

1. Иерархия исключений

Все исключения ядра наследуются от \Exception. Основные типы:

  • \Bitrix\Main\SystemException: Базовое системное исключение.
  • \Bitrix\Main\ArgumentException: Неверный аргумент функции.
  • \Bitrix\Main\ArgumentNullException: Аргумент не должен быть пустым.
  • \Bitrix\Main\ArgumentTypeException: Неверный тип аргумента.
  • \Bitrix\Main\ObjectNotFoundException: Объект не найден.
  • \Bitrix\Main\Db\SqlQueryException: Ошибка в SQL-запросе.

2. Правильный блок try-catch

Оборачивайте рискованные операции (запросы к БД, внешним API, работу с файлами) в блок try-catch.

use Bitrix\Main\Loader;
use Bitrix\Main\SystemException;
use Bitrix\Main\ArgumentException;

try {
    if (!Loader::includeModule('my.module')) {
        throw new SystemException('Модуль my.module не найден');
    }

    $result = MyClass::doSomething($params);
    
    if (!$result) {
        throw new SystemException('Ошибка выполнения операции');
    }

} catch (ArgumentException $e) {
    // Ошибка в аргументах (например, неверный тип)
    echo "Ошибка входных данных: " . $e->getMessage();
} catch (SystemException $e) {
    // Системная ошибка
    // Записываем в лог
    $application = \Bitrix\Main\Application::getInstance();
    $application->getExceptionHandler()->writeToLog($e);
    
    echo "Произошла внутренняя ошибка. Мы уже работаем над этим.";
} catch (\Exception $e) {
    // Любые другие ошибки
    echo "Неизвестная ошибка: " . $e->getMessage();
}

3. Логирование ошибок (ExceptionHandler)

Чтобы ошибка не пропала бесследно, её нужно записать в журнал. В D7 для этого есть ExceptionHandler.

use Bitrix\Main\Application;

try {
    // ... код ...
} catch (\Throwable $e) {
    // Получаем обработчик ошибок
    $exceptionHandler = Application::getInstance()->getExceptionHandler();
    
    // Пишем исключение в лог (по умолчанию в /bitrix/modules/main.log или системный лог)
    $exceptionHandler->writeToLog($e);
}

Настройки логирования задаются в файле .settings.php в секции exception_handling. Там можно указать путь к лог-файлу, уровень детализации и т.д.

Вывод:
Использование исключений позволяет четко разделить «нормальный» ход выполнения программы и обработку аварийных ситуаций.

Всегда ловите исключения и обязательно логируйте их через ExceptionHandler для последующего анализа.

обработка ошибок битрикс, исключения D7, SystemException, ArgumentException, try-catch, ExceptionHandler, логирование ошибок, writeToLog

Мой рейтинг:

Добавить комментарий

Related Post

Слайдер Битрикс (SidePanel): Открытие компонентов и страниц в боковой панелиСлайдер Битрикс (SidePanel): Открытие компонентов и страниц в боковой панели

Средний рейтинг Еще нет оценок Боковая панель (слайдер) — это стандарт де-факто в интерфейсах Битрикс24. Она позволяет открывать формы редактирования, детальные карточки и отчеты «поверх» текущей страницы, не теряя контекст.

Манипуляции с массивами в D7: Класс \Bitrix\Main\Type\CollectionМанипуляции с массивами в D7: Класс \Bitrix\Main\Type\Collection

Средний рейтинг Еще нет оценок В PHP работа с многомерными массивами (например, сортировка списка товаров по цене) часто требует написания громоздких usort с замыканиями. В ядре D7 есть статический класс \Bitrix\Main\Type\Collection, который содержит

Пользовательские поля (UF): Как получать и обновлять их в GetList и D7 ORM*Пользовательские поля (UF): Как получать и обновлять их в GetList и D7 ORM*

Средний рейтинг 1 из 5 звезд. 1 голосов. Пользовательские поля (User Fields, UF-поля) — это стандартный механизм Битрикс для расширения сущностей (пользователей, разделов инфоблоков, HL-блоков и др.) новыми полями без