Обработка сетевых ошибок
Вопрос
Как ты обрабатываешь сетевые ошибки от Retrofit до экрана?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
IOException: нет сети или таймаут; HttpException: код ответа
В репозитории превращаю исключения в доменные ошибки
CancellationException не ловлю
ViewModel переводит ошибку в UiState
Повторы для идемпотентных запросов с задержкой
Офлайн: показать кеш из базы и сообщение
Что могут спросить следом
- Как показать разный текст для разных ошибок?
- Где делать retry: в OkHttp или в репозитории?
Разбор
Retrofit даёт два вида ошибок: IOException, когда проблема в сети или таймауте, и HttpException, когда сервер ответил не 2xx. Ловлю их в репозитории или в обёртке вызова и превращаю в доменные ошибки: нет сети, не найдено, нет доступа, ошибка сервера с кодом. Тело ошибки сервера разбираю, если там есть понятное сообщение. Широкий catch (e: Exception) не пишу, потому что он проглотит CancellationException. ViewModel получает результат и кладёт в UiState состояние ошибки с текстом и действием «Повторить». Для идемпотентных GET-запросов делаю пару повторов с экспоненциальной задержкой, неидемпотентные POST повторяю только с ключом идемпотентности. Если данные есть в базе, показываю их и ненавязчивое сообщение, что данные могли устареть, вместо пустого экрана ошибки.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.