Kotlin中supervisorScope包裹try-catch仍抛异常,是否为设计如此?
Kotlin协程supervisorScope异常捕获问题
先看这段代码:
coroutineScope { try { supervisorScope { launch { error("") } } } catch (t: Throwable) { println("logs and stuff") } }
运行这段代码时,我预期控制台会输出logs and stuff,但实际异常会一直传播到初始作用域,除非作用域安装了CoroutineExceptionHandler否则会失败。
问题:这是设计特性,还是BUG(若是BUG我将提交issue)?
补充说明:将内层的supervisorScope替换为coroutineScope可解决此问题,代码如下:
coroutineScope { try { coroutineScope { launch { error("") } } } catch (t: Throwable) { println("now you'll see it") } }
这是设计特性,不是BUG。
supervisorScope的核心定位是监督作用域:它不会因为单个子协程抛出异常而取消整个作用域,也不会主动将子协程的异常传递给外层的try-catch。子协程的未捕获异常,只会被该协程自身绑定的CoroutineExceptionHandler处理;如果没有设置处理器,异常会直接传播到顶层协程作用域,导致程序崩溃。- 而
coroutineScope是协同作用域:一旦任意子协程抛出异常,整个作用域会立即被取消,同时异常会向上传播,因此外层的try-catch能够捕获到这个异常。
内容的提问来源于stack exchange,提问作者Sergey Lapin
相关产品推荐
相关产品推荐

