当前位置:网站首页>Kotlin协程 - 异常处理
Kotlin协程 - 异常处理
2022-08-09 07:25:00 【懒到死的程序员】
异常的传播
Job的异常传播是双向的,如果异常在局部没有捕获处理便不会重新抛出而是不停地向上传播,由于结构化并发的特性,层次结构中的所有协程都会都会被取消:
- 发生异常先取消自己的所有子协程,接着取消自己,然后将异常传递给父协程;
- 父协程先取消自己的所有子协程,接着取消自己,然后再向上传递一直到根协程。
launch | async | |
作为根协程时 | 异常直接抛出 | 异常通过最终消费即调用await()才抛出 |
作为子协程时 | 异常直接抛出 |
打断传播
当不希望异常向上传播或影响兄弟协程时使用(向下传播依然存在)。
SupervisorScope() | supervisorJob |
子协程发生异常会将该作用域内所有协程取消,但不会影响外部。 | 子协程发生异常不会影响到父协程和兄弟协程。 |
supervisorScope{
launch{
println("子协程1")
throw Exception()
}
launch{
println("子协程2")
}
}
suspend fun main() = runBlocking{
launch(supervisorJob()){
println("子协程1")
throw Exception()
}
launch{
println("子协程2")
}
}
异常的捕获
try-catch 局部捕获 | CoroutineExceptionHandler 全局捕获 |
只能捕获具体代码。捕获协程构建器是无效的,因为结构化并发的原因,无法阻止异常导致的连锁取消。 | 在根协程处捕获作用域内那些未处理的异常,由于达到了顶部,此时内部的连锁取消已完成。 |
CoroutineExceptionHandler
CoroutineExceptionHandler使用条件:
- 要么存在于协程作用域的上下文中
- 要么存在于根协程的直接子协程中
异常会一直向上传播到根协程,根协程如果不作响应(SupervisorScope()或 supervisorJob),则直接子协程会在 coroutineContext 中寻找 CoroutineExceptionHandler 处理,否则走 UncaughtExceptionHandler,所以其它子协程中的 CoroutineExceptionHandler 不会起作用。
以下条件满足时异常会被捕获:
时机:会自动抛出异常的协程所抛出的异常(使用launch而不是async);位置:在协程作用域的上下文中或根协程的直接子协程中。
Android全局异常捕获
可以获取到所有协程未处理的异常,但不能对异常进行捕获,也不能阻止程序崩溃。创建app/src/main/resources/META-INF/services目录,并创建名为 kotlinx.coroutines.CoroutineExceptionHandler的文件,文件的内容填入创建的全局异常处理器的类名。
边栏推荐
- 基于布朗运动的文本生成方法-LANGUAGE MODELING VIA STOCHASTIC PROCESSES
- 高项 04 项目变更管理
- Lottie系列三 :原理分析
- DIMP:Learning Discriminative Model Prediction for Tracking 学习判别模型预测的跟踪
- 【Reprint】Deep Learning (deep learning) study notes arrangement
- dp学习笔记
- Inception V3 Eye Closure Detection
- 入门cv必读的10篇baseline论文
- sklearn数据预处理
- DSP+ARM+FPGA高速PCIE/千兆网口信号仿真介绍
猜你喜欢
虚拟机网卡报错:Bringing up interface eth0: Error: No suitable device found: no device found for connection
排序第四节——归并排序(附有自己的视频讲解)
Inception V3 Eye Closure Detection
常见的分布式事务解决方案
【模板】树链剖分 P3384
低成本、大容量、高交互…Polkadot 引领 GameFi 实现新突破
Flexible and easy-to-use sql monitoring script part7
【机器学习】支持向量机(SVM)代码练习
分布式事务产生的原因
重要消息丨.NET Core 3.1 将于今年12月13日结束支持
随机推荐
tianqf的解题思路
分布式理论
tianqf's problem-solving ideas
找出数组中不重复的值php
RestFul,会话技术,Fiddler
Mysql实操
P1505 [National Training Team] Tourism Tree Chain Breakdown
【机器学习】降维代码练习
Tkinter可以选择的颜色
dp学习笔记
金九银十即将到来,求职套路多,面试指南我来分享~
SAP ALV 数据导出被截断的bug
Invoker 2019CCPC Qinhuangdao Station I Question Simple DP
JSONObject遍历的时候顺序不一致,导致数据对应出错
数据库索引原理
【转载】Deep Learning(深度学习)学习笔记整理
975. 奇偶跳 有序集合
SiamFC:用于目标跟踪的全卷积孪生网络 fully-convolutional siamese networks for object tracking
failed (13: Permission denied) while connecting to upstream
A brief introduction to microservice architecture