> Где должна происходить обработка ошибок: в сервисе или в UI (iOS, Swift)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: Ozon

Стек: iOS, Swift

> Пример ответа

Обработка ошибок должна происходить на обоих уровнях, но с четким разделением ответственности.

В сервисе (уровень бизнес-логики) обрабатываются ошибки, связанные с данными и операциями: сетевые сбои, некорректные ответы сервера, ошибки валидации, отсутствие данных в кэше. Сервис должен преобразовывать сырые ошибки (например, URLError, DecodingError) в доменные типы, понятные для UI. Например, NetworkError.noConnection или AuthError.invalidToken. Сервис также может реализовать повторные попытки (retry) или кэширование, чтобы скрыть временные сбои от пользователя.

В UI обрабатываются ошибки, которые нужно показать пользователю: отображение алертов, тостов, плейсхолдеров или состояний экрана (пустое состояние, ошибка загрузки). UI не должен знать о деталях реализации сервиса - он получает уже подготовленный доменный тип ошибки и решает, как визуально отреагировать. Например, при NetworkError.noConnection UI показывает баннер "Нет интернета", а при AuthError.invalidToken - перенаправляет на экран логина.

Пример на Swift:

SWIFT
// Сервис
enum ServiceError: Error {
case noConnection
case serverError(String)
}
func fetchData() async throws -> Data {
guard isConnected else { throw ServiceError.noConnection }
// ... запрос
}
// ViewModel (UI)
func loadData() {
Task {
do {
let data = try await service.fetchData()
state = .loaded(data)
} catch ServiceError.noConnection {
state = .error("Проверьте подключение к интернету")
} catch {
state = .error("Что-то пошло не так")
}
}
}

Итог: сервис отвечает за "что" (какую ошибку выдать), UI - за "как" (как её отобразить). Это сохраняет тестируемость, переиспользование сервисов и гибкость интерфейса.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью