Flow 异常:27. 操作符中的异常捕获

本篇解析 example-flow-27.kt。探讨 Flow 中各阶段异常的统一捕获。

1. 核心概念:透明性与一致性

Flow 的设计保证了异常处理的透明性。无论异常发生在:

  1. 发射端flow { ... } 构建器内部)。
  2. 转换操作符map, filter, transform 内部)。
  3. 收集端collect 内部)。

都可以使用包裹在 collect 外层的 try-catch 块来统一捕获。

2. 代码解析

1
2
3
4
5
try {
simple().collect { value -> println(value) }
} catch (e: Throwable) {
println("Caught $e")
}
  • 在这个例子中:异常发生在 map 操作符的 check 逻辑中。
  • 结果:即使异常发生在流的中间处理阶段,外层的 try-catch 依然能够感知并捕获它。

3. 开发者感悟

这种“一处捕获,全线生效”的机制极大地降低了异步异常处理的复杂度。你不需要在每个 map 里写 try-catch。只需在业务的最外层(消费端)统一处理即可。这保持了业务逻辑的整洁。

,