Flow 异常:29. Catch 操作符的局限性

本篇解析 example-flow-29.kt。探讨 catch 在处理下游异常时的局限。

1. 核心规则:仅捕获上游异常

catch 操作符遵循异常透明性原则。

规则解析:

  • 它只能捕获发生在它之前(上游)的操作符或构建器的异常。
  • 无法捕获发生在它之后(下游)的异常,特别是 collect 块内部的异常。

2. 代码解析

1
2
3
4
5
6
simple()
.catch { e -> println("Caught $e") } // 这里捕获不到 collect 里的异常
.collect { value ->
check(value <= 1) { "Collected $value" } // 这里抛出的异常会逃逸
println(value)
}
  • 结果:如果 collect 中发生异常,程序依然会因为未捕获异常而崩溃。

3. 开发者感悟

这是一个非常容易踩的坑。很多开发者以为加了 .catch { ... } 就万事大吉了。其实它只保证了“生产”和“加工”阶段的安全,不保证“消费”阶段的安全。如果你需要处理消费阶段的异常,请参考下一节的“声明式捕捉”。

,