You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 09:42:44