使用withThrowingTaskGroup-在'try'表达式中没有调用可抛出函数

9

问题:

我有以下函数,它显示警告信息在'try'表达式内没有调用抛出异常的函数

  • 为什么会出现这个警告?(任务中的代码引发了错误)
  • 我该如何将错误传播到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()
        }
    }
}
1个回答

9
你的 withThrowingTaskGroup 闭包中没有调用任何抛出函数或抛出任何内容。你只是添加了一个任务给组来运行。仅凭这个操作本身不会产生任何异常。虽然 addTask 接受一个带有异常参数的闭包,但它本身并非标记为 throws。只有在等待任务完成时以某种方式触发才可能抛出异常。
例如:
try await group.waitForAll()

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

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

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

1
非常感谢!只是好奇,即使没有调用group.waitForAll()withThrowingTaskGroup是否会等待所有任务完成? - user1046037
1
@user1046037根据文档,它会生效。通常情况下,在组中等待一个或多个任务完成并获取一些结果,以便withThrowingTaskGroup返回一个抛出操作。但是在这里你没有这样做,因此会收到警告。如果你不打算等待组中的任何值,则waitForAll只是消除警告的方法。 - Sweeper
1
这也是需要抛出基础错误的要求。虽然我有“try await withThrowingTaskGroup”,但直到我添加了这行代码,添加的任务中的错误才被传播。谢谢! - Rob S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接