15 网络请求错误处理

在上一节中,我们讨论了网络请求中的 JSON 解析。这一节将重点关注网络请求的错误处理。无论是从服务器返回的错误,还是网络连接本身的问题,处理这些错误对于提升用户体验和应用的稳定性都是至关重要的。

1. 网络请求的错误类型

在进行网络请求时,可能会遇到各种错误,主要可以分为以下几种类型:

  • 网络连接错误:如无网络、超时等。
  • HTTP错误:如404(未找到)、500(服务器内部错误)等。
  • 数据解析错误:如服务器返回的 JSON 格式不正确。
  • 请求取消:用户可能在请求完成前取消了操作。

理解这些错误类型对于设计合理的错误处理逻辑非常关键。

2. 处理网络请求错误

我们通常会将网络请求放在一个 do-catch 块中,以捕获可能抛出的错误。下面是一个简单的使用 URLSession 进行网络请求的示例,并包含错误处理逻辑。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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 获取用户信息,并处理可能发生的错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 显示错误提示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 应用。

15 网络请求错误处理

https://zglg.work/ios-app-dev/15/

作者

AI免费学习网(郭震)

发布于

2024-08-14

更新于

2024-08-15

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论