エラーハンドリングと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 ErrorSwift でのステータス確認
非同期リクエストの後に 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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- async/awaitによるURLSession data(from:)
- Codable:JSONのエンコードとデコード
- エラーハンドリングとHTTPステータスコード
- リトライロジックとバックグラウンドURLSession