0Pricing
Swift Academy · 课时

错误处理运算符

使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 转换和组合流
  2. 调度器与线程
  3. 错误处理运算符
  4. 自定义发布者与订阅者
← 返回 Swift Academy