Ответ вслух Middle Сеть: Retrofit и OkHttp обновлено

Обработка сетевых ошибок

Вопрос

Как ты обрабатываешь сетевые ошибки от Retrofit до экрана?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Retrofit даёт два вида ошибок: IOException, когда проблема в сети или таймауте, и HttpException, когда сервер ответил не 2xx. Ловлю их в репозитории или в обёртке вызова и превращаю в доменные ошибки: нет сети, не найдено, нет доступа, ошибка сервера с кодом.

Что должно прозвучать в ответе

  • IOException: нет сети или таймаут; HttpException: код ответа

  • В репозитории превращаю исключения в доменные ошибки

  • CancellationException не ловлю

  • ViewModel переводит ошибку в UiState

  • Повторы для идемпотентных запросов с задержкой

  • Офлайн: показать кеш из базы и сообщение

Что могут спросить следом

  • Как показать разный текст для разных ошибок?
  • Где делать retry: в OkHttp или в репозитории?

Разбор

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

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.