【发布时间】:2021-02-10 20:34:50
【问题描述】:
我有一个 Generator 类,它基本上会生成一些数据,例如:
interface Generator {
suspend fun generate(): String?
}
有多种实现方式。其中一些可能会抛出异常,而其中一些可能需要很长时间才能生成数据:
class Faulty : Generator {
override suspend fun generate(): String? {
println("Faulty")
throw IllegalArgumentException();
}
}
class Lingering : Generator {
override suspend fun generate(): String? {
println("Lingering")
delay(Duration.ofHours(1))
return null
}
}
但有些实现是值得的
class Good : Generator {
override suspend fun generate(): String {
println("Good")
return "Goooood"
}
}
我需要做的是收集由预配置生成器列表生成的数据,为每个生成器设置一个超时 generate 并忽略异常(但记录它们):
fun main() = runBlocking {
val generators = listOf(Faulty(), Lingering(), Good())
val results = supervisorScope {
generators
.map { generator ->
async(CoroutineExceptionHandler { context, exception ->
println(exception)
}) {
withTimeoutOrNull(5000) {
generator.generate()
}
}
}
.awaitAll()
.filterNotNull()
}
println(results)
}
问题是这段代码fails有异常:
Faulty
Lingering
Good
Exception in thread "main" java.lang.IllegalArgumentException
at Faulty.generate (File.kt:12)
at FileKt$main$1$results$1$1$2$1.invokeSuspend (File.kt:41)
at FileKt$main$1$results$1$1$2$1.invoke (File.kt:-1)
为什么supervisorScope 没有捕捉到它?我做错了什么?
【问题讨论】: