kotlin: 用SupervisorJob控制异常传播的范围。

一,例一:用 SupervisorJob避免因异常崩溃

代码:

        //处理按钮点击事件
        binding.button1.setOnClickListener {
            runBlocking {
                val scope = CoroutineScope(SupervisorJob())
                scope.async {
                    println("scope.async开始");
                    delay(100L)
                    1 / 0
                }
                println("delay开始")
                delay(500L)
                println("End")
            }
        }

运行结果:

image

当我们使用 SupervisorJob 创建一个 scope 以后,用 scope.async{}启动协程后,
只要不调用“deferred.await()”,程序就不会因为异常而崩溃

二,例二,用 SupervisorJob+try-catch捕捉异常

代码:

        //处理按钮点击事件
        binding.button2.setOnClickListener {
            runBlocking {
                val scope = CoroutineScope(SupervisorJob())
                // 变化在这里
                val deferred = scope.async {
                    println("scope.async开始");
                    delay(100L)
                    1 / 0
                }
                println("delay1开始");
                delay(500L)
                try {
                    println("try开始");
                    deferred.await()
                } catch (e: ArithmeticException) {
                    println("e开始");
                    println("Catch: $e")
                }
                println("delay2开始");
                delay(500L)
                println("End")
            }
        }

运行结果:

image

说明:

SupervisorJob 与 Job 最大的区别就在于,
当它的子 Job 发生异常的时候,其他的子 Job 不会受到牵连。

普通Job:如果 父Job 是一个普通的 Job 对象,
那么当 子Job job1 发生异常之后,它会导致 父Job 取消,
进而导致 子Job job2、子Job job3 等也受到牵连。

 

posted @ 2025-08-02 15:06  刘宏缔的架构森林  阅读(24)  评论(0)    收藏  举报