【发布时间】:2020-06-24 18:26:36
【问题描述】:
我有以下 sn-p 用于测试目的;
fun main() {
val myScope = CoroutineScope(Dispatchers.Default) + Job()
myScope.launch {
val job = async {
delay(1000)
throw RuntimeException("shiiiet")
}
try {
job.await()
} catch (ret: RuntimeException){
throw RuntimeException("yooo!")
}
}
try {
Thread.sleep(5000)
} catch(e: Exception){
}
println("wohoooo!")
}
我以为流量永远不会到达最后一个“哇哦!”行,但我错了。我看到它打印在屏幕上。我认为launch 会将异常传播到父作用域的原因是,由于父作用域不处理它,它会在到达 print 语句时使 JVM 崩溃。
这是因为父作用域在子作用域失败后被取消,收到 CancellationException 并被忽略?
【问题讨论】:
-
一个失败的顶级
launch不会使 JVM 崩溃,也不应该崩溃。崩溃的线程也不会导致 JVM 崩溃。 -
确实如此,但我不知何故认为异常会通过范围一直传播到主线程。
-
默认调度器不负责主线程。在纯 Java 上,主线程甚至不运行事件循环,因此根本无法调度协程。您必须使用 runBlocking 在其上显式创建事件循环。
标签: kotlin exception coroutine kotlin-coroutines