本篇解析 example-exceptions-05.kt。探讨当多个子协程同时抛出异常时,协程库是如何处理这些冲突的。
1. 核心概念:第一个异常获胜
当多个子协程因为不同的异常而失败时,基本的聚合规则是:“取第一个抛出的异常”。
特点:
- 第一个异常:作为主异常,传递给
CoroutineExceptionHandler。 - 后续异常:会被绑定到主异常的
suppressed列表中(仅限 JDK 7+)。
2. 代码解析
1 | val handler = CoroutineExceptionHandler { _, exception -> |
3. 开发者感悟
这是一个非常严密的并发错误处理机制。它保证了即便在复杂的并行任务中,也不会漏掉任何一个报错信息。所有的异常都能通过主异常的 suppressed 列表进行溯源。在调试高并发 Bug 时,检查 suppressed 列表是寻找真凶的关键。