Result и ошибки
Объект Bitrix\Main\Result используется для возврата предсказуемых бизнес-ошибок валидации и операций с данными с обязательной проверкой статуса через isSuccess(). Исключения (Exception) зарезервированы для критических системных сбоев инфраструктуры, а смешивание обоих подходов в рамках одного метода считается антипаттерном.
Прогресс хранится в этом браузере. Войдите, чтобы сохранить его в аккаунте.
Что нужно понимать
-
1
\Bitrix\Main\Result
-
2
\Bitrix\Main\Error
-
3
\Bitrix\Main\ErrorCollection
-
4
Обработка ошибок
Материалы
Официальная документация
Материалы BXMax
Проверь себя
Заказчик жалуется: заказ не сохранился, а ошибок никто не видел. Что произошло в коде?
Результат OrderTable::update() не проверили. Ошибка осталась внутри UpdateResult, и её никто не спросил. У ORM-результата есть __destruct(), который в этом случае бросает E_USER_WARNING с текстом ошибок, но на проде с выключенным выводом его увидит только лог.
Чем плох addError(new Error($e->getMessage())) без второго аргумента?
Код ошибки остаётся 0, и фронтенд вынужден различать ошибки по тексту, который завтра переведут или перефразируют. Код — машинный идентификатор, текст — для человека, customData — для имени поля или дополнительных данных.
Когда возвращать Result, а когда бросать исключение?
Result — для ожидаемых отказов, которых может быть несколько сразу: валидация, бизнес-правило, нет остатка. Исключение — для программных ошибок и падений инфраструктуры: неверный аргумент, база недоступна. Смешивать в одном методе нельзя: проверивший isSuccess() код всё равно упадёт.
Сервису нужно копить ошибки между несколькими вызовами методов. Что использовать вместо Result?
Интерфейс Errorable и трейт ErrorableImplementation: getErrors(), getErrorByCode(), hasErrors(). Так устроен Engine Controller, и так фильтры добавляют свои ошибки в общий список контроллера.
Не сходится?
Спросите ассистента BXMax: он знает документацию и материалы сайта по этой теме.
Знаете материал лучше?
Предложите ссылку: после проверки она появится в этом разделе.
Войти, чтобы предложить