在RxJava中安排基本运算符的正确方法

时间:2017-04-14 07:34:06

标签: exception-handling rx-java

   mSubscriptions.add(api.signIn(phoneNumber, otp)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .doOnError(throwable -> Timber.e(throwable.getMessage()))
        .onErrorResumeNext(throwable -> Observable.empty())
        .subscribe(user -> {
          // Handle user object logic here
          }
        }));

我通常在调度程序的所有应用程序中使用此模式并处理异常,但有时我会得到一个非法的状态异常:Scheduler.Worker线程抛出异常。添加onError处理。由rx.exceptions.OnErrorNotImplementedException引起,所以我想知道这是否正确。 提前谢谢。

2 个答案:

答案 0 :(得分:2)

正如@yosriz所提到的 - 正确的方式是在每个订阅者中实现onError回调。在您的情况下,由于您的"处理用户对象逻辑" 投掷,您最有可能获得OnErrorNotImplementedException

简单示例:

流中的

异常:

Observable.just("value")
    .flatMap(s -> Observable.error(new IllegalStateException()))
    .onErrorResumeNext(t -> Observable.empty())
    .doOnCompleted(() -> System.out.println("Completed"))
    .subscribe(s -> {});
  

已完成

onNext回调中的异常:

Observable.just("value")
    .onErrorResumeNext(t -> Observable.empty())
    .doOnCompleted(() -> System.out.println("Completed"))
    .subscribe(s -> {
        throw new IllegalStateException();
    });
  

rx.exceptions.OnErrorNotImplementedException   ...   引起:java.lang.IllegalStateException

onNext回调中的异常,订阅者onError实现:

Observable.just("value")
    .onErrorResumeNext(t -> Observable.empty())
    .doOnCompleted(() -> System.out.println("Completed"))
    .subscribe(s -> {
        throw new IllegalStateException();
    }, t -> {
        System.out.println("Subscriber's onError triggered");
    });
  

订阅者触发了错误

答案 1 :(得分:1)

安排调度程序与您获得的此类错误无关。如果您没有对订阅者进行onError()处理(subscribe()方法),并且您在流中某处无法处理错误,则可能会出现问题。
doOnError()无法解决此问题,因为它只是一个副作用运算符,可以对任何onError()执行某些操作。
实际上,在您的示例中,onErrorResumeNext()将处理错误,因为它会吞下任何错误,因此可能您有其他方案,您不处理所有错误方案,因此得到错误未实现异常。
作为一般模式,准备好任何案例并在订阅者处实施onError()总是更好,以避免在流中没有处理错误的情况。