【发布时间】:2022-12-24 05:59:42
【问题描述】:
我正在用这个测试函数测试协程的异常处理机制:
suspend fun test(){
supervisorScope {launch(createExceptionHandler(1)) {
coroutineScope {launch(createExceptionHandler(2)) {
supervisorScope {launch { //SUPERVISOR WITH NO HANDLER
coroutineScope {launch(createExceptionHandler(4)) {
coroutineScope {launch(createExceptionHandler(5)) {
throw Exception("Testing")
}}
}}
}}
}}
}}
}
fun createExceptionHandler(i: Int) = CoroutineExceptionHandler { _, throwable ->
"---> exception handler #$i caught: ${throwable}".log()
}
结果:
---> exception handler #2 caught: java.lang.Exception: Testing
我原以为处理程序 #1 会捕获异常,令我惊讶的是,处理程序 #2 捕获了它!
阅读 docs,我希望处理程序 #2、#4、#5 被完全忽略:
...特别是,所有子协程(在另一个作业的上下文中创建的协程)将异常处理委托给它们的父协程,父协程也委托给父协程,依此类推直到根,所以 CoroutineExceptionHandler 安装在它们的上下文中从未使用过。
我的理解是异常在到达根时停止传播,或者主管范围带有异常处理程序。所以我认为处理程序 #1 会处理异常。
这个测试函数 (2) 似乎证实了我的信念:
suspend fun test2(){ supervisorScope {launch(createExceptionHandler(1)) { supervisorScope {launch(createExceptionHandler(2)) { supervisorScope {launch { supervisorScope {launch { supervisorScope {launch { throw Exception("Testing") }} }} }} }} }} }结果:
---> exception handler #2 caught: java.lang.Exception: Testing
我已经在线阅读了许多关于异常传播和处理的指南,但我非常坚持这一点......
任何线索都会有所帮助,感谢阅读!
【问题讨论】:
标签: android kotlin kotlin-coroutines kotlin-multiplatform kotlin-multiplatform-mobile