Может ли быть ситуация, когда данные пришли, но при этом возникла ошибка
Что проверяют
Понимаете ли вы, что «успех» и «ошибка» не всегда исключают друг друга, и умеете ли моделировать такое состояние в коде и интерфейсе. Интервьюер ждёт конкретных сценариев из сетевого слоя, а не общих слов про валидацию. Следом обычно спрашивают, как это отражается в модели состояния экрана.
Как отвечать
Да, и чаще, чем кажется. Разберите по уровням:
- HTTP-ошибка с телом:
URLSessionсчитает ошибкой только сбой транспорта. Ответ 404 или 500 приходит сerror == nilи с данными, где сервер описал проблему. Вариантtry await URLSession.shared.data(for:)тоже не бросит исключение на 500, статус изHTTPURLResponseпроверяете вы; - 200 с ошибкой внутри: API отвечает
{"success": false, ...}или GraphQL возвращает частичныеdataвместе с массивомerrors. Часть экрана можно показать, часть нет; - данные не декодируются: ответ корректный, но
JSONDecoderпадает сDecodingError, потому что сервер переименовал поле или прислалnullтам, где модель ждёт значение; - кэш плюс сбой сети: экран показывает сохранённые данные, а обновление не удалось. Это тоже одновременно «данные есть» и «ошибка есть».
Отсюда вывод для архитектуры: Result<T, Error> описывает только «или то, или другое». Для экрана удобнее состояние, где значение и ошибка живут вместе, например структура с полями value: T? и error: Error? или отдельный случай перечисления для устаревших данных. Тогда интерфейс показывает список и поверх него плашку «Не удалось обновить».
Ошибки декодирования стоит логировать с путём до поля из DecodingError.Context, а необязательные поля делать опциональными, чтобы одно сломанное поле не роняло весь экран.
Где спотыкаются
Проверяют только параметр error в колбэке и считают любой ответ с данными успешным. В итоге текст ошибки сервера пытаются декодировать как модель.
Сводят всё к Result и при ошибке обновления стирают уже показанные данные. Пользователь видит пустой экран вместо вчерашнего списка.
Глотают DecodingError через try?. Приложение молча показывает пустоту, и понять, какое поле сломалось, уже нельзя.