kotlinx.coroutines.channels.ChannelResult三个on函数调用条件及单独触发场景问询
仅触发onFailure或onClosed的场景分析
仅触发onFailure的场景
- 消费端抛出未捕获异常:在处理元素的逻辑中主动抛出未捕获的运行时异常,且框架未将该异常判定为流终止信号时,只会触发
onFailure,不会调用onClosed。比如在onSuccess回调内执行throw new RuntimeException("处理失败"),框架仅会通过onFailure通知错误,不会终止整个订阅关系。 - 上游发送独立错误信号:部分响应式框架支持上游发送单个错误事件但不终止流(如自定义流实现),此时
onFailure会被触发,但流仍保持活跃状态,因此onClosed不会被调用。
仅触发onClosed的场景
- 主动取消订阅:消费者主动调用取消订阅的方法(如RxJava的
dispose()、Reactor的dispose()),此时流正常关闭且无错误产生,只会触发onClosed,不会触发onFailure。 - 上游正常完成流:上游流发送完所有元素后发送完成信号(如响应式流规范中的
onComplete),订阅关系正常结束,仅会触发onClosed。 - 无错误的框架主动关闭:框架因达到预设消费上限、无错误超时等场景主动关闭订阅时,没有错误发生,只会触发
onClosed。
内容的提问来源于stack exchange,提问作者progquester
相关产品推荐
相关产品推荐

