Обработка ошибок и коды состояния 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 — локальная установка не требуется.
Все уроки этого курса
- URLSession data(from:) с async/await
- Codable: кодирование и декодирование JSON
- Обработка ошибок и коды состояния HTTP
- Логика повторных попыток и фоновый URLSession