Выбор ответа Junior Сеть, Codable и хранение спрашивают часто обновлено

URLSession и HTTP-статусы ошибок

Вопрос

try await URLSession.shared.data(for: request) вернул ответ со статусом 500. Что произойдёт?

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: Ошибки не будет: статус нужно проверить в HTTPURLResponse.statusCode. URLSession бросает ошибки транспортного уровня: нет сети, таймаут, отмена, проблемы TLS.

Варианты ответа

  1. Будет брошена URLError.badServerResponse с кодом ответа внутри
  2. Будет брошена DecodingError: тело не соответствует модели
  3. URLSession сама повторит запрос до трёх раз, затем бросит URLError
  4. Ошибки не будет: статус нужно проверить в HTTPURLResponse.statusCodeправильный ответ

Разбор

URLSession бросает ошибки транспортного уровня: нет сети, таймаут, отмена, проблемы TLS. Любой полученный HTTP-ответ, включая 4xx и 5xx, для неё успех. Поэтому сетевой слой приводит URLResponse к HTTPURLResponse, проверяет диапазон 200-299 и бросает свою ошибку. DecodingError появится, только если пытаться декодировать тело ошибки как модель. Автоматических повторов нет.

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

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