首页 > 解决方案 > 在 Kotlin 回调流构建器中捕获异常

问题描述

我有一个看起来像这样的消费者:

// ItemConsumer.kt
try {
    job = itemService
            .connect()
            .flowOn(Dispatchers.IO)
            .catch { e ->
                throw e
            }
            .onEach {
                // Update UI for each item collected
            }
            .launchIn(viewModelScope)
} catch (e : Exception) {
    // Handle exception
}

我有一个看起来像这样的制片人:

// ItemService.kt (Producer)
fun connect():Flow<Item> = callbackFlow {
    check(1 == 0) // This is expected to throw an IllegalStateException
}

我知道 .catch { } 将处理消费者的 .collect { } 或 .onEach { } 块内出现的任何问题。但是我怎样才能抛出 callbackFlow { } 构建器内部发生的异常,以便它可能被消费者的 .catch { } 捕获?

标签: kotlinkotlin-coroutineskotlin-flow

解决方案


你不能。流构建器函数永远不会抛出异常。Flows 是冷的,这意味着在调用 collect 之前不会执行任何代码。即使集合的执行产生异常,您也将始终成功构建流程。


推荐阅读