协程异常聚合的理解

还没进行源码分析,下面的理解只是从异常发生机制来解释:

一般来说,协程中子协程出现了异常,会传递到顶级父协程,父协程这时会取消其余的子协程,

  1. 默认情况下(非SupervisorScope): 如果父协程没有使用supervisorScope创建子协程,那么当一个子协程出现异常被取消时,其他子协程也会被取消。这种情况下,被取消的子协程会抛出CancellationException

  2. SupervisorScope: 如果父协程使用了supervisorScope创建子协程,那么当一个子协程出现异常被取消时,其他子协程不会受到影响,它们会继续执行。被取消的子协程会将异常传递给它的父协程,但不会取消其他子协程。

这里发生的异常聚合肯定是指第一种情况,使用CoroutineExceptionHandler来实现异常聚合。通过设置一个统一的异常处理器,可以捕获父协程及其所有子协程中抛出的异常,从而统一进行处理,简单来讲就是让异常变得更直观,更容易管理,而且其余异常绑定在第一个异常之上。

下面代码来分析:

使用CoroutineExceptionHandler捕获:

 @Test
    fun testException() = runBlocking<Unit> {
        val handler = CoroutineExceptionHandler{_, exception ->
            println("caught $exception ${exception.suppressed.contentToString()}")

        }
        val scope = CoroutineScope(Dispatchers.Default).launch(handler) {
            //第二个子协程
                launch {
                    try {
                        delay(Long.MAX_VALUE)
                    } finally {
                        throw ArithmeticException()
                    }
                }
            //第一个子协程
            launch {
                delay(100)
                throw RuntimeException()
            }
        }
        scope.join()
    }

 运行结果:

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Imagine8877

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值