协程的异常处理
1. 协程异常处理框架要点
- 全局异常处理:捕获所有协程中的未处理异常。
- 局部异常处理:特定协程的异常捕获和处理。
- 异常重试
- 异常日志记录
2. 协程构建器与异常的传播
- launch协程构建器: 用于启动不返回值的协程。当使用
launch
时,如果协程内部发生了异常,会自动将异常传播到外部,类似于java的Thread.uncaughtExceptionHandler
。launch
启动的协程如果抛出未捕获的异常,协程将崩溃,异常将会被传递到应用程序的全局异常处理机制,会爆出CoroutineExceptionHandler
。 - async 和 produce 协程构建器:用于启动期望返回结果的协程。与launch不同,
async
和produce
启动的协程不会自动处理异常,而是将异常暴露给调用者。async
启动的协程会返回一个Deferred
对象,该对象可以通过await()
方法来获取结果。await()
方法会抛出协程中的异常,因此,调用者需要显示处理这些异常。而produce
启动的是一个协程生产者(通过通道返回数据)。异常会通过receive()
方法传递给调用者。
2. 协程异常的传播
被取消的协程会挂在起点抛出 CancellationException 并且会被协程的机制忽略。 协程构建器有两种形式:自动传播异常(launch:启动不返回值的协程
) 或 向用户暴露异常(async 与 produce: 启动协程并期望返回结果
)。当构建器用于创建一个根协程时,