我在文档中找不到任何定义以下行为的内容
// 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/