swift - 在根任务中抛出错误

标签 swift

我在文档中找不到任何定义以下行为的内容

// task-less context
Task.detached {
    try await myThrowingFunction()
    runWhenSuccessful()
}

该方法在抛出线上返回并丢弃错误,并且永远不会调用 runWhenSuccessful()。虽然它在某种程度上是有道理的,但我至少希望它会触发断言失败或针对未处理的错误。

处理这个问题的正确方法是什么,因为我无法处理任何父任务中的错误。

我是否希望每次都将闭包中的所有内容包装在 do/catch 中?

最佳答案

在我看来,根据设计,任务希望您使用 do/catch 处理 block 内的错误,如果您不这样做,错误将被丢弃。

任务确实有一个 result任务完成时您可以读取的属性,但它会阻塞当前线程,因此它可能不是您想要的。

如果您经常使用此模式,则可以为采用失败闭包的 Task 创建一个便捷的初始化程序。

这是自定义初始化器的样子,以及它的使用方式:

extension Task where Failure == Never, Success == Void {
    init(priority: TaskPriority? = nil, operation: @escaping () async throws -> Void, `catch`: @escaping (Error) -> Void) {
        self.init(priority: priority) {
            do {
                _ = try await operation()
            } catch {
                `catch`(error)
            }
        }
    }
}

Task {
    try await asyncTask()
} catch: { error in
    handle(error)
}

关于swift - 在根任务中抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70314263/

相关文章:

ios - 在 if 语句中使用多个 contains 函数 (Swift)

ios - 快速从 xml 中读取评论或评论节点

ios - UIPageControl pageIndicator 快速将位置更改为左侧或右侧

ios - 无法在重构的 Storyboard上设置标签栏角标(Badge)值

ios - uitableViewCell 转场不起作用。因为触发器?

xcode - 存档提交失败,出现错误

ios - 被发送到一个不符合 "com"属性的 KVC 的对象

JavaScript 未在 WKWebView 中执行

swift - iCarousel 仅在调整大小后显示图像

ios - 当用户在 swift ios 中选择 tableview 行时显示复选标记