【问题标题】:Continue after catching exception in AsyncThrowingStream for-try-await (Swift)在 AsyncThrowingStream for-try-await (Swift) 中捕获异常后继续
【发布时间】:2022-01-26 13:47:46
【问题描述】:

我正在实现一个带有 AsyncSequence 的 find 方法,它的声明类似于

find(text: String) -> AsyncThrowingStream<[Widgets], Error> 

方法实现会查询多个来源,并且 UI 会随着结果的增加而更新。如果其中一个来源抛出错误,我想处理它并使用剩余结果更新 UI。

我正在使用 for-try-await 执行此操作,但我不确定如何处理异常。使用下面的代码,在捕获异常后迭代停止(除了查看代码,我只是不确定如何使用 for-try-await 语法处理异常,例如迭代继续)。

var results = [Widgets]()
do {
    for try await items in asyncStream {
        results.append(contentsOf: items)
    }
} catch let error {
    // handle error
}

如何在不取消迭代的情况下处理异常?例如。在 asyncStream 中有 3 个项目产生 throws Error, A, Bresult 将是 [A, B]

谢谢!

【问题讨论】:

    标签: swift async-await


    【解决方案1】:

    再次查看 AsyncThrowingStream 文档后

    与 AsyncStream 相比,这种类型可以从等待的 next() 中抛出错误,后者会以抛出的错误终止流。

    抛出错误会终止流,因此无法使用此 api 完成上述操作。当然,您可以实现自己的异步序列。但是,鉴于 AsyncSequence 语义,抛出错误并继续可能会令人困惑。如果错误不应终止流,则最好将其包装在返回类型中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-20
      • 2019-02-21
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      • 2011-02-07
      • 2017-04-04
      • 1970-01-01
      相关资源
      最近更新 更多