本篇解析 example-exceptions-04.kt。探讨非 CancellationException 异常如何在协程层级中“株连九族”。
1. 核心概念:双向取消
在协程中,如果一个子协程由于异常(非取消信号)而失败:
- 向上抛出:子协程会向上传递异常给父协程。
- 父协程失败:父协程接收到异常后,会立即标记自己为失败。
- 向下取消:父协程会同时取消其所有的其他子协程(即“兄弟协程”)。
- 汇总处理:只有当所有的子协程都由于取消而终止后,父协程才会最终处理原始异常。
2. 异常捕获点
在这种模式下,即使你在子协程内部写了 try-catch 或设置了 handler,通常也无法阻止父协程和兄弟协程的被动取消。异常最终会传播到根协程。
3. 开发者感悟
这是一个非常严格的设计,强调了任务的整体性。如果你有多个并行的子任务,且希望其中一个失败不影响其他任务,你需要使用 supervisorScope 或 SupervisorJob(这将在后续章节讨论)。这种默认的传播机制更适合处理那些“一荣俱荣,一损俱损”的强关联任务。