CoroutineExceptionHandler未捕获异常



我运行这个代码

fun main(args: Array<String>) = runBlocking {
val exceptionHandler = CoroutineExceptionHandler { _, _ ->
println("handled")
}
val job = launch(exceptionHandler) {
throw java.lang.RuntimeException("foobar")
}
job.join()
println("Finished")
}

但是foobar异常未被处理并且handled未被打印到控制台

线程中的异常"主";java.lang.RuntimeException:foobar在MainKt$main$1$outer$1.invokeSuspend(main.kt:10(位于kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33(在kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106(在kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:279(在kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:85(在kotlinx.coroutines.BuildersKt_BuildersKt.runBlocking(Builders.kt:59(在kotlinx.coroutines.BuildersKt.runBlocking(未知源(在kotlinx.coroutines.BuildersKt_BuildersKt.runBlocking$default(Builders.kt:38(在kotlinx.coroutines.BuildersKt.runBlocking$default(未知源(在MainKt.main(main.kt:3(

为什么会这样?

由于某种原因,job似乎不是父作业。只有父级的处理程序才能处理其子级的异常。因此,我们需要定义一个范围,并用作业对其进行初始化。此作业将成为父作业。

fun f2() = runBlocking {
val exceptionHandler = CoroutineExceptionHandler { _, _ ->
println("handled")
}
val cs = CoroutineScope(Job() + exceptionHandler)
val job = cs.launch {
throw java.lang.RuntimeException("foobar")
}
job.join()
}

最新更新