Как из сервиса вернуть доменную ошибку и отдать корректный HTTP-код? Контекст: обработка ошибок в backend-сервисах и API Для представления доменных ошибок применяю исключения (exceptions) либо error objects В сервисном слое создаю специализированные ошибки с описанием причины, например NotFoundError или ValidationError В контроллере либо middleware перехватываю ошибки и связываю их с HTTP-кодами: 400 — ошибки валидации 404 — ресурс отсутствует 403 — доступ запрещён 500 — непредвиденная ошибка Формирую ответ с корректным статусом и информативным JSON, содержащим сообщение об ошибке Для единообразия и удобства сопровождения использую…
Как из сервиса вернуть доменную ошибку и преобразовать её в корректный HTTP-код?
Как из сервиса вернуть доменную ошибку и отдать корректный HTTP-код? Контекст: обработка ошибок в backend-сервисах и API Для представления доменных ошибок применяю исключения (exceptions) либо error objects В…
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Как из сервиса вернуть доменную ошибку и отдать корректный HTTP-код?
- Контекст: обработка ошибок в backend-сервисах и API
- Для представления доменных ошибок применяю исключения (exceptions) либо error objects
- В сервисном слое создаю специализированные ошибки с описанием причины, например NotFoundError или ValidationError
- В контроллере либо middleware перехватываю ошибки и связываю их с HTTP-кодами:
- 400 — ошибки валидации
- 404 — ресурс отсутствует
- 403 — доступ запрещён
- 500 — непредвиденная ошибка
- Формирую ответ с корректным статусом и информативным JSON, содержащим сообщение об ошибке
- Для единообразия и удобства сопровождения использую централизованный обработчик ошибок
- Так доменная логика не зависит от протокола, а взаимодействие клиента с API становится понятнее
Подробный ответ
Основной ответ
Чтобы сервис мог вернуть доменную ошибку с корректным HTTP-кодом, необходимо разделить бизнес-логику и транспортный слой. Обычно сервис выбрасывает или возвращает специальные доменные ошибки — exceptions либо объекты ошибок с контекстом проблемы. Контроллер или API-слой перехватывает их, сопоставляет с HTTP-статусом и отправляет клиенту ответ с соответствующим кодом и сообщением.
Ключевые моменты
- Определение собственных доменных ошибок: их наследуют от базового класса ошибок и наделяют понятным смыслом, например
ValidationError,NotFoundError,BusinessRuleViolationError. - Обработка ошибок на уровне контроллера или middleware (в зависимости от фреймворка, например Express в Node.js или ASP.NET middleware) выполняет маппинг каждой доменной ошибки на HTTP-статус: 400 для валидации, 404 — для отсутствующих ресурсов, 409 — для конфликтов.
- Безопасность и аудит: клиенту следует отправлять только необходимую информацию, а полное описание ошибки сохранять в логах отдельно.
- В сложных системах также используют паттерн Result / Either: сервис не выбрасывает исключение, а возвращает результат с признаком успеха или ошибки и сопутствующими метаданными.
Практический контекст
Например, в ASP.NET Core 6 можно создать глобальный фильтр исключений (ExceptionFilter), который перехватывает доменные ошибки и возвращает ProblemDetails с нужным HTTP-кодом. В REST API на Spring Boot (Java) применяют @ControllerAdvice: его методы обрабатывают кастомные исключения и передают статус через ResponseEntity. Такой подход упрощает тестирование и сопровождение кода, а также улучшает UX при работе с API.