rxjava - 如何在不终止整个过程的情况下处理合并异常

时间:2014-11-10 11:30:44

标签: exception exception-handling rx-java

我创造了两个可观察者 其中一个抛出异常。

obs1 = Observable.from(new Integer[]{1, 2, 3, 4, 5, 6});

obs2 = Observable.create(new Observable.OnSubscribe<Integer>() {
    @Override public void call(Subscriber<? super Integer> subscriber) {
        boolean b = getObj().equals(""); // this throws an exception
        System.out.println("1");
    }
});

现在我使用

调用它们
Observable.merge(obs2, obs1)
          .subscribe(new Observer<Integer>() {
                @Override public void onCompleted() {
                    System.out.println("onCompleted");
                }

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

                @Override public void onNext(Integer integer) {
                    System.out.println("onNext - " + integer);
                }
            });

现在,我不希望我的进程在发生异常时完全停止 -
我想处理它,我希望obs1继续它的工作。

我试图使用onErrorResumeNext(),onExceptionResumeNext(),doOnError()来编写它 但没有任何帮助 - obs1没有运行。

如何在不停止处理其他observable的情况下处理异常?

2 个答案:

答案 0 :(得分:3)

听起来你需要mergeDelayError

答案 1 :(得分:0)

问题在于您的订户已损坏。您应该捕获异常并致电onError。否则,你违反了rx合同。

示例:

    Observable<Integer> obs1 = Observable.from(Arrays.asList(1, 2, 3, 4, 5, 6));

    Observable<Integer> obs2 = Observable.create((Subscriber<? super Integer> subscriber) -> {
        subscriber.onError(new NullPointerException());
    });

    Observable.merge(obs2.onErrorResumeNext((e) -> Observable.empty()), obs1)
            .subscribe(new Observer<Integer>() {
                @Override public void onCompleted() {
                    System.out.println("onCompleted");
                }

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

                @Override public void onNext(Integer integer) {
                    System.out.println("onNext - " + integer);
                }
            });

因此,如果您使用此代码替换obs2代码,它应该像您预期的那样工作:

obs2 = Observable.create(new Observable.OnSubscribe<Integer>() {
    @Override public void call(Subscriber<? super Integer> subscriber) {
        try {

            boolean b = getObj().equals(""); // this throws an exception
            System.out.println("1");
        } catch(Exception ex) {
            subscriber.onError(ex);
        }
    }
});