Ответ вслух Middle Ошибки обновлено

Стратегия обработки ошибок в iOS-приложении

Вопрос

Как вы строите обработку ошибок в приложении: от сетевого слоя до экрана?

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

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

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

Коротко

Ошибки у меня проходят через слои и на каждом меняют смысл. Сетевой слой бросает технические ошибки: нет сети, таймаут, статус 401, не разобрался JSON.

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

  • Слои переводят ошибки в свои типы: сетевые, доменные, понятные UI

  • Не глотать ошибки через `try?` там, где важна причина

  • Пользователю понятный текст и действие (повторить), а не код ошибки

  • Отмену не показывать как ошибку

  • Логирование и крэш-репортинг с контекстом, без персональных данных

  • `precondition`/`fatalError` только для ошибок программиста

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

  • Как вы показываете ошибку, если на экране уже есть данные из кеша?
  • Где ретраи: в сетевом слое или во view model?

Разбор

Ошибки у меня проходят через слои и на каждом меняют смысл. Сетевой слой бросает технические ошибки: нет сети, таймаут, статус 401, не разобрался JSON. Репозиторий переводит их в доменные: «сессия истекла», «нет связи», «данные устарели». View model решает, что показать: полноэкранную ошибку с кнопкой «Повторить», тост поверх данных из кеша или ничего, если это отмена при уходе с экрана. try? использую только там, где причина действительно не важна. Каждая ошибка логируется с контекстом в крэш-аналитику, но без персональных данных. Ретраи для идемпотентных запросов делаю в сетевом слое с экспоненциальной задержкой. А fatalError и precondition оставляю только для ошибок программиста, не для данных извне.

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

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