You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

响应式编程中遇上游错误不中断元素处理的实现方案

问题2:Mutiny框架场景修复

原代码中.onFailure().recoverWithItem(0)是针对整个流的错误恢复,流中出现第一个错误时,它会返回指定值并直接终止流,所以后续元素不会被处理。要实现单个元素错误不中断流,需要针对每个元素的转换操作单独处理错误。

推荐用onItem().handle方法,它允许手动处理每个元素的转换,遇到错误时可以选择发射默认值或忽略该元素,同时不终止整个流。

修改后的代码:

Multi.createFrom().items(1, 2, 3, 4, 5, 0, 7, 8, 9, 10)
        .onRequest().invoke(req -> System.out.println("Got a request: " + req))
        .onItem().handle((i, emitter) -> {
            try {
                // 正常计算时发射结果
                emitter.emit(100 / i);
            } catch (ArithmeticException e) {
                // 除零错误时发射0;如果要忽略该元素,改成emitter.request(1)即可
                emitter.emit(0);
            }
        })
        .subscribe().withSubscriber(new Flow.Subscriber<Integer>() {

            private Flow.Subscription subscription;

            @Override
            public void onSubscribe(Flow.Subscription s) {
                this.subscription = s;
                s.request(1);
            }

            @Override
            public void onNext(Integer item) {
                System.out.println("Got item " + item);
                subscription.request(1);
            }

            @Override
            public void onError(Throwable t) {
                System.out.println("error " + t);
            }

            @Override
            public void onComplete() {
                System.out.println("finish");
            }
        });

修改后,每个元素的转换错误被局部处理,流会继续处理后续所有元素,最终正常完成。


内容的提问来源于stack exchange,提问作者robyp7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 03:00:08