前提
SwiftでiOSアプリを作成しています。
この中で、URLSession
を使用してAPIアクセスしているのですが、
エラーハンドリングについて質問になります。
Swift, iOSについて初心者で、調べ調べなんとかかんとかやっており、
Swiftではそんなやり方しない、というようなお作法などにも疎いため、
的はずれなことをやろうとしているかもしれません。
実現したいこと
APIアクセスの結果が、エラーあるいはレスポンスのステータスコードが成功以外の時、
例外をスローして外側でエラー時の処理をしたい。
発生している問題・エラーメッセージ
該当のソースコードに埋め込んだコメントここを throw にしたい
の部分をthrowにすると、
Invalid conversion from throwing function of type '(Data?, URLResponse?, Error?) throws -> Void' to non-throwing function type '(Data?, URLResponse?, Error?) -> Void'
のエラーになる。
URLSession.shared.dataTask
のcompletionHandler
が例外スローできるものではないので当然ではあるのですが...。
他の言語などで、APIリクエストする場合、HTTPステータスコードに合わせて、適当な例外をスローして、
呼び出し元で処理するということはあると思っておりまして。
該当のソースコード
swift
func postApi() -> Void { guard let url = URL("hogegApiUrl") else {return} var request = URLRequest(url) request.httpMethod = "POST" request.setValue("Application/json", "Content-Type") URLSession.shared.dataTask(request) {(data, response, error) in if let error = error { print("APIアクセス時にエラーが発生しました。: error={\(error)}") return // ここを throw error などにして、関数の呼び出し元で処理したい。 } if let response = response as? HTTPURLResponse { if !(200...299).contains(response.statusCode) { print("レスポンスのステータスコードが成功以外でした。: response={\(response)}") return // ここも throw NSError() などにして、関数の呼び出し元で処理したい。 } // リクエスト成功時の処理 略 } }.resume() }
まだ回答がついていません
会員登録して回答してみよう