15 网络请求错误处理
在上一节中,我们讨论了网络请求中的 JSON
解析。这一节将重点关注网络请求的错误处理。无论是从服务器返回的错误,还是网络连接本身的问题,处理这些错误对于提升用户体验和应用的稳定性都是至关重要的。
1. 网络请求的错误类型
在进行网络请求时,可能会遇到各种错误,主要可以分为以下几种类型:
- 网络连接错误:如无网络、超时等。
- HTTP错误:如404(未找到)、500(服务器内部错误)等。
- 数据解析错误:如服务器返回的
JSON
格式不正确。 - 请求取消:用户可能在请求完成前取消了操作。
理解这些错误类型对于设计合理的错误处理逻辑非常关键。
2. 处理网络请求错误
我们通常会将网络请求放在一个 do-catch
块中,以捕获可能抛出的错误。下面是一个简单的使用 URLSession
进行网络请求的示例,并包含错误处理逻辑。
import UIKit
enum NetworkError: Error {
case noConnection
case badResponse
case dataNotFound
}
func fetchData(from url: String, completion: @escaping (Result<Data, NetworkError>) -> Void) {
guard let url = URL(string: url) else {
completion(.failure(.dataNotFound))
return
}
let task = URLSession.shared.dataTask(with: url) { data, response, error in
// 检查网络错误
if let error = error {
print("网络请求错误: $error.localizedDescription)")
completion(.failure(.noConnection))
return
}
// 检查HTTP响应
guard let httpResponse = response as? HTTPURLResponse else {
completion(.failure(.badResponse))
return
}
// HTTP状态码处理
guard (200...299).contains(httpResponse.statusCode) else {
print("请求错误: $httpResponse.statusCode)")
completion(.failure(.badResponse))
return
}
// 检查数据
guard let data = data else {
completion(.failure(.dataNotFound))
return
}
completion(.success(data))
}
task.resume()
}
在上述代码中,我们定义了一个 fetchData
函数来发起网络请求,并使用了 Result
来处理成功和失败的情况。在错误处理方面,我们分别检查了网络连接错误、HTTP响应状态以及数据的有效性。
3. 错误处理示例
为了更直观地理解错误处理,下面是一个完整的案例,假设我们要从一个 API
获取用户信息,并处理可能发生的错误。
fetchData(from: "https://api.example.com/user") { result in
switch result {
case .success(let data):
print("成功获取数据: $data)")
// 这里可以继续进行 JSON 解析
case .failure(let error):
switch error {
case .noConnection:
print("请检查您的网络连接。")
case .badResponse:
print("服务器返回错误,请稍后再试。")
case .dataNotFound:
print("未能找到数据。")
}
}
}
在这个案例中,根据不同的错误类型,我们在主线程上进行相应的提示处理。这可以帮助用户了解到当前的问题,并给出相应的解决方法。
4. 用户界面反馈
在实际应用中,我们还需要将错误信息展示给用户,以便他们能够理解发生了什么。可以使用 UIAlertController
显示错误提示。
func showErrorAlert(for error: NetworkError) {
var message: String
switch error {
case .noConnection:
message = "请检查您的网络连接。"
case .badResponse:
message = "服务器返回错误,请稍后再试。"
case .dataNotFound:
message = "未能找到数据。"
}
let alert = UIAlertController(title: "错误", message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "确定", style: .default, handler: nil))
// 在主线程上展示
DispatchQueue.main.async {
if let topController = UIApplication.shared.keyWindow?.rootViewController {
topController.present(alert, animated: true, completion: nil)
}
}
}
在这个 showErrorAlert
函数中,我们接收 NetworkError
,并创建相应的 UIAlertController
来向用户展示错误信息。
结语
通过对网络请求错误的处理,我们能够提升应用的用户体验,让用户更好地理解发生了什么,以及需要如何处理。这一节为后面的持久化数据做准备,能够在数据请求失败时通过本地缓存的数据来提高容错率。在下一节中,我们将深入探讨 Core Data
的基本使用,继续构建我们的 iOS 应用。