【问题标题】:withThrowingTaskGroup - No calls to throwing functions occur within 'try' expressionwithThrowingTaskGroup - 'try' 表达式中不调用抛出函数
【发布时间】:2025-11-30 20:20:08
【问题描述】:

问题:

我有以下函数显示警告No calls to throwing functions occur within 'try' expression

问题:

  • 为什么会显示此警告? (任务里面的代码会报错)
  • 我应该怎么做才能将错误传播给f1的调用者?

代码:

func f1() async throws {
    try await withThrowingTaskGroup(of: Int.self) { group in //No calls to throwing functions occur within 'try' expression
        group.addTask(priority: .high) {
            throw NSError()
        }
    }
}

【问题讨论】:

    标签: ios swift async-await swift-concurrency


    【解决方案1】:

    您确实没有在withThrowingTaskGroup 闭包中调用任何抛出函数或抛出任何东西。您刚刚为组添加了要运行的任务。这本身不会抛出任何东西。 addTask 没有标记为throws,尽管它的闭包参数是。它只会在您以一种或另一种方式等待任务完成时抛出。

    例如:

    try await group.waitForAll()
    

    或者如果你想循环遍历组中的每个任务:

    for try await someInt in group {
        // ...        
    }
    

    如果您在 withThrowingTaskGroup 闭包中返回某些内容,那么 withThrowingTaskGroup 也会返回。如果你在闭包中抛出错误,withThrowingTaskGroup 将抛出该错误(因为它是 rethrows),f1 也会抛出该错误。

    【讨论】:

    • 非常感谢!只是好奇withThrowingTaskGroup 不会等待所有任务完成即使group.waitForAll() 没有被调用?
    • @user1046037 是的,根据文档。通常你会等待组中的一个或多个任务并获得某种结果让withThrowingTaskGroup 返回,这将是一个抛出操作。但是您在这里没有这样做,因此发出警告。如果您不打算等待组中的任何值,那么waitForAll 只是一种使警告静音的方法。