持续创作,加速成长!这是我参与「掘金日新计划 · 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: 第三个协程")
}
}
}
在java和kotlin中都可以使用try catch包住整个代码块让应用不受影响,kotlin 协程也有一种处理异常的办法,我技术有限,不在这讨论原理是怎么怎么实现的,咱就是看看它是怎么使用的。
var exceptionHandler = CoroutineExceptionHandler { coroutineContext, throwable ->
Log.e(TAG, "handleError: 捕捉到异常=$throwable")
}
定一个CoroutineExceptionHandler 然后丢在在根协程的lanch中像下面这样
lifecycleScope.launch(exceptionHandler) {}
这样就能捕捉到协程出现的异常啦,但是还要注意一点,CoroutineExceptionHandler只有设置在根协程才有效果,在子协程设置是没有效果的
只会执行前面两个协程,第三个协程因为第二个协程的原因断掉了,断了原因这个跟协程的作用域有关系,关于协程的作用域我现在了解的有两个coroutineScope 和 supervisorScope,第一个一般是默认的,没有另外声明的话就是这个,supervisorScope需要**
lifecycleScope.la
**但是在这发现,它unch(exceptionHandler) {
supervisorScope {
}
}
- coroutineScope
- 这个主协程下只要有一个子协程运行中断,它后续的协程就不会运行了
- supervisorScope
- 这个主协程下的子协程的作用域是单独的,不会受其他子协程的运行影响
咱们看看添加supervisorScope后它是怎么样的
可以看到这个第三个协程没有因为第二个协程的异常受到影响。