Flow 异常:30. 声明式捕捉与收集异常

本篇解析 example-flow-30.kt。学习一种能覆盖全流程异常处理的优雅写法。

1. 核心技巧:onEach + catch

为了让 catch 操作符能够捕获到原本在 collect 中的异常,我们可以通过以下重构方式:

重构步骤:

  1. collect { ... } 中的业务逻辑移动到 onEach { ... } 操作符中。
  2. 确保 onEach 位于 catch 之前(上游)
  3. 最后使用无参的 collect() 启动流。

2. 代码解析

1
2
3
4
5
6
7
simple()
.onEach { value ->
check(value <= 1) { "Collected $value" } // 业务逻辑在这里
println(value)
}
.catch { e -> println("Caught $e") } // 现在它可以捕获到上面 check 抛出的异常了
.collect()
  • 结果:这种链式调用非常整洁,所有的异常(生产、加工、消费)都被统一在 catch 块中处理了。

3. 开发者感悟

这是我最推崇的一种 Flow 异常处理模式。它避免了嵌套 try-catch 块,让数据流处理变得纯粹、声明式。在 Android 的 ViewModelRepository 中,这种模式能极大地提高代码的可维护性。

,