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引起,所以我想知道这是否正确。
提前谢谢。
答案 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()
总是更好,以避免在流中没有处理错误的情况。