本篇解析 example-exceptions-02.kt。学习如何全局捕获未处理的协程异常。
1. 核心概念:最后防线
CoroutineExceptionHandler 是协程中的 Thread.UncaughtExceptionHandler。
特点:
- 全局捕获:用于处理那些没有被
try-catch捕获且向上传播到根协程的异常。 - 不可恢复:当它被触发时,协程已经由于异常而终止。你无法在其中“恢复”协程运行。
- 生效位置:它必须设置在根协程(由
GlobalScope或CoroutineScope()创建的顶级协程)中。
2. 规则解析
- 子协程无效:如果你在子协程(在另一个 Job 上下文中创建的协程)设置处理者,它不会生效。因为子协程总会将异常委托给父协程处理。
- async 无效:
async产生的异常由deferred.await()负责,即使在GlobalScope.async中设置了handler,它也不会在后台静默触发打印。
3. 开发者感悟
CoroutineExceptionHandler 通常用于记录异常日志或弹出全局错误对话框。在 Android 开发中,不要期望用它来“挽救”崩溃,它的作用是让你在应用退出前知道发生了什么。