我如何返回一个RxJava可观察对象,它保证不会抛出OnErrorNotImplementedException?
我想在我的应用程序中创建一个模式,其中所有返回的我如何返回一个RxJava可观察对象,它保证不会抛出OnErrorNotImplementedException?,java,rx-java,Java,Rx Java,我想在我的应用程序中创建一个模式,其中所有返回的可观察的对象都有一些默认的错误处理,这意味着订阅者可以使用.subscribe(onNext)重载,而不用担心应用程序崩溃。(通常您必须使用.subscribe(onNext,onError))。有没有办法做到这一点 我已经尝试通过使用onerrorrurn、doOnError和onerrorrumerenext来附加到可观察对象,但它们都没有帮助我的案例。也许我做错了,但是如果在可观察对象中发生错误,我仍然会得到rx.exceptions.OnE
可观察的
对象都有一些默认的错误处理,这意味着订阅者可以使用.subscribe(onNext)
重载,而不用担心应用程序崩溃。(通常您必须使用.subscribe(onNext,onError)
)。有没有办法做到这一点
我已经尝试通过使用onerrorrurn
、doOnError
和onerrorrumerenext
来附加到可观察对象,但它们都没有帮助我的案例。也许我做错了,但是如果在可观察对象中发生错误,我仍然会得到rx.exceptions.OnErrorNotImplementedException
编辑1:这是一个发出错误的可观察对象的示例,我想在中间层处理它:
Observable.create(subscriber -> {
subscriber.onError(new RuntimeException("Somebody set up us the bomb"));
});
编辑2:我已尝试使用此代码代表消费者处理错误,但仍然得到OnErrorNotImplementedException
:
// obs is set by the method illustrated in edit 1
obs = obs.onErrorResumeNext(throwable -> {
System.out.println("This error is handled by onErrorResumeNext");
return null;
});
obs = obs.doOnError(throwable -> System.out.println("A second attempt at handling it"));
// Consumer code:
obs.subscribe(
s -> System.out.println("got: " + s)
);
这将起作用-关键是
返回Observable.empty()代码>
私有可观测attachErrorHandler(可观测obs){
返回obs.onErrorResumeNext(可丢弃->{
System.out.println(“printint到控制台的处理错误:“+throwable”);
return-Observable.empty();
});
}
//这样使用:
Observable unsafeObs=getErrorProducingObservable();
可观测安全可观测=attachErrorHandler(未观测);
//此调用现在将不会导致OnErrorNotImplementedException
safeObservable.subscribe(s->System.out.println(“结果:+s));
能否提供一个OnErrorNotImplementedException
的示例?OnErrorNotImplementedException
的堆栈跟踪应该在代码中包含真正的异常。在这种情况下,真正的异常是不相关的。相关的是,subscriber.onError
由可观察对象在内部调用,最终订户不需要定义处理该错误的方法。也就是说,中间层应该处理它。有关这种可观察的示例,请参见编辑。您如何使用onErrorReturn
或onErrorResumeNext
?它应该捕获错误,除非您在onErrorReturn
或onErrorResumeNext
中抛出一些错误。请参阅我的编辑2OneErrorReturn
可以工作,但如果发生错误,我真的不希望消费者收到任何事件。只有当它成功完成时
private <T> Observable<T> attachErrorHandler(Observable<T> obs) {
return obs.onErrorResumeNext(throwable -> {
System.out.println("Handling error by printint to console: " + throwable);
return Observable.empty();
});
}
// Use like this:
Observable<String> unsafeObs = getErrorProducingObservable();
Observable<String> safeObservable = attachErrorHandler(unsafeObs);
// This call will now never cause OnErrorNotImplementedException
safeObservable.subscribe(s -> System.out.println("Result: " + s));