错误处理运算符
使用 catch、retry 和 replaceError 恢复。
错误处理运算符 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
组合框架中的错误
组合框架的 publisher 具有失败类型。当 publisher 失败时,数据流会终止——不会再发出任何值。要构建具有韧性的流水线,您需要使用能够处理、转换或恢复错误的运算符。
失败类型
每个 publisher 都会声明一个 Output 和一个 Failure。只有当错误类型一致时,流水线才能编译通过,因此用于改变失败类型的运算符很常见。
let publisher: AnyPublisher<Data, URLError> = apiClient.request()
// Output = Data, Failure = URLError捕获
捕获会拦截失败,并用一个新的 publisher 替换失败的 publisher。这样,当出现问题时,您就可以提供备用值。
apiClient.fetchUser()
.catch { error in
Just(User.guest)
}
.sink { user in
print("Got", user.name)
}
.store(in: &cancellables)replaceError
replaceError(with:) 是 catch 的简化形式:它会将任何失败替换为一个备用值,并以成功状态完成。
apiClient.fetchCount()
.replaceError(with: 0)
.sink { count in
self.badge.text = "\(count)"
}
.store(in: &cancellables)retry
retry(n) 失败时会重新订阅上游,最多重试 n 次。它非常适合处理暂时性的网络错误。
apiClient.fetchData()
.retry(3)
.sink(receiveCompletion: { print($0) },
receiveValue: { print($0) })
.store(in: &cancellables)组合 retry 与捕获
一种常见的弹性模式:重试几次;如果所有尝试都失败,则捕获错误并使用备用方案。
apiClient.fetchData()
.retry(2)
.catch { _ in
Just(Data())
}
.sink { data in
self.process(data)
}
.store(in: &cancellables)mapError
mapError 会将一种错误类型转换为另一种错误类型。这对于将不同上游失败统一为单一的应用级错误类型至关重要。
enum AppError: Error { case network }
apiClient.request()
.mapError { _ in AppError.network }
.sink(receiveCompletion: { _ in }, receiveValue: { _ in })
.store(in: &cancellables)mapError 的重要性
组合发布者时,它们的 Failure 类型必须匹配。mapError 会规范化不匹配的错误,使 merge 和 zip 等运算符能够编译,也让您的 sink 只需处理一种错误类型。
setFailureType
某些发布者(例如 Just)的失败类型为 Never。setFailureType(to:) 可以将它们衔接起来,使其能够与会失败的发布者组合。
Just(42)
.setFailureType(to: AppError.self)
.merge(with: failablePublisher)
.sink(receiveCompletion: { _ in }, receiveValue: { _ in })
.store(in: &cancellables)处理完成事件
在 sink 中,完成闭包会告诉您数据流是正常结束还是失败。请检查它,以便对上游未恢复的错误做出响应。
publisher.sink(
receiveCompletion: { completion in
if case .failure(let error) = completion {
self.showAlert(error)
}
},
receiveValue: { value in
self.update(value)
}
).store(in: &cancellables)设计弹性管道
错误处理的最佳实践:
- 对暂时性失败使用 retry
- 对备用方案使用 捕获 或 replaceError
- 使用 mapError 统一错误类型
- 始终在
sink中处理失败情况
快速检查
测试您对错误处理的掌握程度。
回顾
您已经学习了 Combine 的错误处理运算符:
- 捕获 / replaceError — 提供备用方案
- retry — 失败时重新尝试
- mapError / setFailureType — 统一错误类型
它们结合起来,可以让您构建出能够平稳降级的管道,而不是在第一次错误时就终止。
常见问题解答
「错误处理运算符」课时是免费的吗?
是的 — 「错误处理运算符」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「错误处理运算符」这节课中我会学到什么?
使用 catch、retry 和 replaceError 恢复。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「错误处理运算符」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 转换和组合流
- 调度器与线程
- 错误处理运算符
- 自定义发布者与订阅者