前提
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
1func postApi() -> Void { 2 guard let url = URL("hogegApiUrl") else {return} 3 4 var request = URLRequest(url) 5 request.httpMethod = "POST" 6 request.setValue("Application/json", "Content-Type") 7 8 URLSession.shared.dataTask(request) {(data, response, error) in 9 if let error = error { 10 print("APIアクセス時にエラーが発生しました。: error={\(error)}") 11 return // ここを throw error などにして、関数の呼び出し元で処理したい。 12 } 13 14 if let response = response as? HTTPURLResponse { 15 if !(200...299).contains(response.statusCode) { 16 print("レスポンスのステータスコードが成功以外でした。: response={\(response)}") 17 return // ここも throw NSError() などにして、関数の呼び出し元で処理したい。 18 } 19 20 // リクエスト成功時の処理 21 略 22 23 } 24 }.resume() 25 26}
回答1件
あなたの回答
tips
プレビュー