java - 如何返回保证不会抛出 OnErrorNotImplementedException 的 RxJava Observable?

标签 java rx-java

我想在我的应用程序中创建一个模式,其中所有 Observable<T>返回的对象有一些默认的错误处理,这意味着订阅者可以使用 .subscribe(onNext)重载而不必担心应用程序崩溃。 (通常您必须使用 .subscribe(onNext, onError) )。有什么办法可以达到这个目的吗?

我尝试使用 onErrorReturn 附加到 Observable , doOnErroronErrorResumeNext - 他们中没有人对我的案子有帮助。也许我做错了,但我仍然得到 rx.exceptions.OnErrorNotImplementedException如果 Observable 内发生错误。

编辑 1:这是发出错误的 Observable 的示例,我想在某个中间层处理该错误:

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();

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));

关于java - 如何返回保证不会抛出 OnErrorNotImplementedException 的 RxJava Observable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32349025/

相关文章:

java - 合并多个表中的一些记录后如何找出表名?

android - 使用改造和 rxjava 2.x 处理空响应

rx-java - 多个可观察量链接在一起以完成

android - 条件链单一且可完成

java - 基于 RxJava 和游标的 RESTful 分页

java - 如何让我的代码使用带有 if 语句的扫描仪跳过用户输入,

java - 为什么我无法为这个泛型类传入某个参数?

java - jdbc4connection + boneCP + MAT的内存泄漏

java - 将 csv 数据作为 zipentry 对象移动到 zip 存档 - 构造函数 ZipEntry(Path) 未定义

java - RX : Run Zipped Observables in parallel?