Kotlin 协程(二)协程的异常处理

91 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

做Android的想必大家都知道Exception这个东西,当我们程序碰到这个东西,没有try catch的话,我们的应用到这就没了,及其影响用户体验。

lifecycleScope.launch() {
    launch {
        launch {
            Log.e(TAG, "handleError: 第一个协程")
        }
        launch {
            Log.e(TAG, "handleError: 第二个协程")
            throw NullPointerException()
        }
        launch {
            Log.e(TAG, "handleError: 第三个协程")
        }
    }
}

image.png 在java和kotlin中都可以使用try catch包住整个代码块让应用不受影响,kotlin 协程也有一种处理异常的办法,我技术有限,不在这讨论原理是怎么怎么实现的,咱就是看看它是怎么使用的。

var exceptionHandler = CoroutineExceptionHandler { coroutineContext, throwable ->
    Log.e(TAG, "handleError: 捕捉到异常=$throwable")
}

定一个CoroutineExceptionHandler 然后丢在在根协程的lanch中像下面这样

lifecycleScope.launch(exceptionHandler) {}

这样就能捕捉到协程出现的异常啦,但是还要注意一点,CoroutineExceptionHandler只有设置在根协程才有效果,在子协程设置是没有效果的

image.png 只会执行前面两个协程,第三个协程因为第二个协程的原因断掉了,断了原因这个跟协程的作用域有关系,关于协程的作用域我现在了解的有两个coroutineScope 和 supervisorScope,第一个一般是默认的,没有另外声明的话就是这个,supervisorScope需要** lifecycleScope.la **但是在这发现,它unch(exceptionHandler) { supervisorScope {


    }
}
  • coroutineScope
    • 这个主协程下只要有一个子协程运行中断,它后续的协程就不会运行了
  • supervisorScope
    • 这个主协程下的子协程的作用域是单独的,不会受其他子协程的运行影响

咱们看看添加supervisorScope后它是怎么样的

image.png

可以看到这个第三个协程没有因为第二个协程的异常受到影响。