Rid*_*dje 3 kotlin kotlin-flow
我有一个返回流量的函数:
fun myFlow = flow {
try {
emit(localDataSource.fetchData())
} catch(e: Exception) {
// just skip this error
}
emit(remoteDataSource.fetchData(1000, 0))
}
Run Code Online (Sandbox Code Playgroud)
在一种特殊情况下,我只需要第一个发出的值,无论它是来自本地缓存还是远程源。我尝试过这个:
fun getRandomFavoriteItem() = myFlow.first().filter { it.score > 7 }.randomOrNull()
但first()调用总是抛出
java.lang.IllegalStateException:违反了流异常透明度:先前的“emit”调用引发了异常 kotlinx.coroutines.flow.internal.AbortFlowException:流已中止,不再需要元素,但随后尝试发射值。
java.lang.IllegalArgumentException:流有多个元素
java.lang.IllegalStateException:违反了流异常透明度:先前的“emit”调用引发了异常 kotlinx.coroutines.flow.internal.AbortFlowException:流已中止,不再需要元素,但随后尝试发射值
myFlow.catch { e ->
if (e !is IllegalArgumentException) {
throw e
}
}.first().filter { it.score > 7 }.randomOrNull()
Run Code Online (Sandbox Code Playgroud)
这不是 中的错误first()
。这是您流程中的错误。 不允许您以您所拥有的方式吞掉 Flow 中的所有异常。
一些不同的方法可能会在是否检测到该错误方面有所不同,但您必须修复的是如何“跳过”所有异常。考虑仅捕获您关心的特定异常,或者至少确保捕获并重新抛出CancellationException
或其子类。
归档时间: |
|
查看次数: |
1694 次 |
最近记录: |