Kotlin Flow中.catch操作符的异常捕获范围与执行逻辑疑问
Kotlin Flow catch 操作符异常捕获机制答疑
首先给出你提到的官方示例代码:
class NewsRepository(...) { val favoriteLatestNews: Flow<List<ArticleHeadline>> = newsRemoteDataSource.latestNews .map { news -> news.filter { userData.isFavoriteTopic(it) } } .onEach { news -> saveInCache(news) } // 出现异常时发射最近的缓存数据 .catch { exception -> emit(lastCachedNews()) } }
1. catch 可捕获的异常范围
Kotlin Flow 的 catch 操作符的核心规则是:仅能捕获其上游所有流源、中间操作符抛出的未处理异常,下游抛出的异常无法捕获。对应你列出的三个场景:
- 可以捕获
newsRemoteDataSource.latestNews上游源流抛出的异常 - 可以捕获
.map操作符抛出的异常 - 可以捕获
.onEach操作符抛出的异常
以上三个全部位于catch的上游范围,因此抛出的异常都能被捕获。
2. .map抛异常后的执行逻辑
如果.map操作符执行过程中抛出异常,后续的.onEach操作符完全不会执行。
Flow的事件传递是严格按上下游顺序串行执行的,上游一旦出现未处理异常,正常的事件下发链路会立即中断,事件不会继续向下传递给后续的中间操作符,会直接跳转执行catch中的异常处理逻辑。
内容的提问来源于stack exchange,提问作者SmallGrammer
相关产品推荐
相关产品推荐

