Стратегия обработки ошибок в iOS-приложении
Вопрос
Как вы строите обработку ошибок в приложении: от сетевого слоя до экрана?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Слои переводят ошибки в свои типы: сетевые, доменные, понятные UI
Не глотать ошибки через `try?` там, где важна причина
Пользователю понятный текст и действие (повторить), а не код ошибки
Отмену не показывать как ошибку
Логирование и крэш-репортинг с контекстом, без персональных данных
`precondition`/`fatalError` только для ошибок программиста
Что могут спросить следом
- Как вы показываете ошибку, если на экране уже есть данные из кеша?
- Где ретраи: в сетевом слое или во view model?
Разбор
Ошибки у меня проходят через слои и на каждом меняют смысл. Сетевой слой бросает технические ошибки: нет сети, таймаут, статус 401, не разобрался JSON. Репозиторий переводит их в доменные: «сессия истекла», «нет связи», «данные устарели». View model решает, что показать: полноэкранную ошибку с кнопкой «Повторить», тост поверх данных из кеша или ничего, если это отмена при уходе с экрана. try? использую только там, где причина действительно не важна. Каждая ошибка логируется с контекстом в крэш-аналитику, но без персональных данных. Ретраи для идемпотентных запросов делаю в сетевом слое с экспоненциальной задержкой. А fatalError и precondition оставляю только для ошибок программиста, не для данных извне.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.