代码之家  ›  专栏  ›  技术社区  ›  Era

在根任务中抛出错误

  •  0
  • Era  · 技术社区  · 3 年前

    我在文档中找不到以下行为的定义

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

    该方法返回抛出行并丢弃错误和 runWhenSuccessful() 永远不会被召唤。虽然它在某种程度上是有意义的,但我至少预期它会触发断言失败,或者引发未经处理的错误。

    既然我不能处理任何父任务中的错误,那么正确的处理方法是什么。

    我是不是要把所有的东西都包起来 do/catch 每一次?

    1 回复  |  直到 3 年前
        1
  •  0
  •   EmilioPelaez    3 年前

    在我看来,通过设计,任务希望您使用 do/catch ,如果不这样做,错误将被丢弃。

    任务确实有其特殊性 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)
    }