0Pricing
Swift Academy · レッスン

エラーハンドリングとHTTPステータスコード

レスポンスのステータスコードを確認し、エラーを型付きドメインエラーにマッピングします。

「エラーハンドリングとHTTPステータスコード」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これは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 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

特定のエラーの捕捉

型付き catch ブロックを使用すると、呼び出し側のコードで異なる種類のエラーを個別に処理できます。

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 ラッパー

呼び出し側で try/catch を使わずにエラーを処理する場合は、フェッチ関数から Result を返します。

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)")
}

ユーザー向けエラーメッセージ

技術的なエラーを、ユーザーにわかりやすい文字列に変換します。UI に生の 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時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「エラーハンドリングとHTTPステータスコード」で何を学びますか?

レスポンスのステータスコードを確認し、エラーを型付きドメインエラーにマッピングします。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「エラーハンドリングとHTTPステータスコード」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. async/awaitによるURLSession data(from:)
  2. Codable:JSONのエンコードとデコード
  3. エラーハンドリングとHTTPステータスコード
  4. リトライロジックとバックグラウンドURLSession
← Swift Academyに戻る