0Pricing
Swift Academy · Урок

Обработка ошибок и коды состояния HTTP

Проверяйте коды состояния ответа и преобразуйте ошибки в типизированные ошибки предметной области.

«Обработка ошибок и коды состояния HTTP» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Диапазоны кодов состояния HTTP

Ответы HTTP сообщают об успехе или сбое с помощью кодов состояния: 2xx — успех, 3xx — перенаправление, 4xx — ошибка клиента, 5xx — ошибка сервера.

// 200 OK, 201 Created
// 400 Bad Request, 401 Unauthorized, 404 Not Found
// 500 Internal Server Error

Проверка состояния в Swift

Приведите URLResponse к типу HTTPURLResponse и проверьте statusCode после асинхронного запроса.

let (data, response) = try await URLSession.shared.data(from: url)
guard let http = response as? HTTPURLResponse else {
  throw NetworkError.invalidResponse
}
guard (200..<300).contains(http.statusCode) else {
  throw NetworkError.httpError(http.statusCode)
}

Типизированные сетевые ошибки

Определите перечисление типизированных ошибок для сбоев сети, чтобы обеспечить обработку всех вариантов в блоках catch.

enum NetworkError: Error {
  case invalidURL
  case invalidResponse
  case httpError(Int)
  case decodingError(Error)
  case noData
}

Преобразование кодов состояния в ошибки

Обрабатывайте коды состояния с помощью switch, чтобы выдавать содержательные ошибки предметной области вместо необработанных целых чисел.

switch http.statusCode {
case 200..<300: break // success
case 401: throw NetworkError.unauthorized
case 404: throw NetworkError.notFound
case 500..<600: throw NetworkError.serverError(http.statusCode)
default: throw NetworkError.httpError(http.statusCode)
}

Декодирование ответов с ошибками

Если состояние указывает на ошибку, тело ответа часто содержит сообщение об ошибке в формате JSON. Декодируйте его для более точной диагностики.

if http.statusCode != 200 {
  struct APIError: Decodable { var message: String }
  let apiError = try? JSONDecoder().decode(APIError.self, from: data)
  throw NetworkError.serverMessage(apiError?.message ?? "Unknown error")
}

Передача ошибок в async

Структурированная конкурентность Swift естественным образом передаёт ошибки: возникшая ошибка отменяет соседние задачи в TaskGroup.

async let users = fetchUsers()
async let posts = fetchPosts()
let (u, p) = try await (users, posts) // if either throws, both cancel

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

Используйте типизированные блоки обработки, чтобы по-разному обрабатывать разные виды ошибок в вызывающем коде.

do {
  let items = try await fetchItems()
} catch NetworkError.unauthorized {
  showLoginScreen()
} catch NetworkError.httpError(let code) {
  print("HTTP Error: \(code)")
} catch {
  print("Unexpected: \(error)")
}

Коды URLError

URLError описывает сбои подключения: .notConnectedToInternet, .timedOut, .cannotFindHost.

do {
  let (data, _) = try await URLSession.shared.data(from: url)
} catch let urlError as URLError where urlError.code == .notConnectedToInternet {
  print("No internet connection")
}

Обёртка Result для сетевых запросов

Возвращайте Result<T, NetworkError> из функций fetch, если хотите, чтобы вызывающий код обрабатывал ошибки без try/catch.

func fetchUser() async -> Result<User, NetworkError> {
  do {
    let user = try await performFetch()
    return .success(user)
  } catch let e as NetworkError {
    return .failure(e)
  } catch {
    return .failure(.unknown)
  }
}

Запись ошибок

Записывайте сетевые ошибки вместе с важным контекстом (URL, кодом состояния и телом ответа), чтобы упростить отладку в рабочей среде.

func log(_ error: NetworkError, url: URL) {
  print("[Network] \(url.absoluteString) → \(error)")
}

Сообщения об ошибках для пользователя

Преобразуйте технические ошибки в понятные пользователю строки. Никогда не показывайте необработанные коды состояния HTTP в интерфейсе.

extension NetworkError: LocalizedError {
  var errorDescription: String? {
    switch self {
    case .unauthorized: return "Please log in again."
    case .notFound: return "The requested item was not found."
    case .serverError: return "Server error. Please try again later."
    default: return "Something went wrong."
    }
  }
}

Быстрая проверка

Какой диапазон кодов состояния HTTP указывает на успешный ответ?

Итоги урока

После URLSession.data(from:) приведите результат к HTTPURLResponse и проверьте statusCode. Преобразуйте коды в типизированные варианты Error. Используйте URLError для сбоев подключения. Передавайте ошибки с помощью try/throw и обрабатывайте их типизированными блоками catch.

Часто задаваемые вопросы

Урок «Обработка ошибок и коды состояния HTTP» бесплатный?

Да — полный текст урока «Обработка ошибок и коды состояния HTTP» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Обработка ошибок и коды состояния HTTP»?

Проверяйте коды состояния ответа и преобразуйте ошибки в типизированные ошибки предметной области. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Обработка ошибок и коды состояния HTTP»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. URLSession data(from:) с async/await
  2. Codable: кодирование и декодирование JSON
  3. Обработка ошибок и коды состояния HTTP
  4. Логика повторных попыток и фоновый URLSession
← Назад к Swift Academy