协程进阶:异常 02. CoroutineExceptionHandler

本篇解析 example-exceptions-02.kt。学习如何全局捕获未处理的协程异常。

1. 核心概念:最后防线

CoroutineExceptionHandler 是协程中的 Thread.UncaughtExceptionHandler

特点:

  • 全局捕获:用于处理那些没有被 try-catch 捕获且向上传播到根协程的异常。
  • 不可恢复:当它被触发时,协程已经由于异常而终止。你无法在其中“恢复”协程运行。
  • 生效位置:它必须设置在根协程(由 GlobalScopeCoroutineScope() 创建的顶级协程)中。

2. 规则解析

  • 子协程无效:如果你在子协程(在另一个 Job 上下文中创建的协程)设置处理者,它不会生效。因为子协程总会将异常委托给父协程处理。
  • async 无效async 产生的异常由 deferred.await() 负责,即使在 GlobalScope.async 中设置了 handler,它也不会在后台静默触发打印。

3. 开发者感悟

CoroutineExceptionHandler 通常用于记录异常日志或弹出全局错误对话框。在 Android 开发中,不要期望用它来“挽救”崩溃,它的作用是让你在应用退出前知道发生了什么。

,