RxJava:在传递给onError之前,我可以拦截所有错误吗?

时间:2018-12-14 05:25:01

标签: rx-java rx-java2

假设我有一个执行危险操作的流:

void main() {
    Observable.just(1)
            .doOnNext(integer -> dangerousOperation())
            .subscribe(
                    integer -> {
                        // TODO
                    },
                    error -> {
                        if (error instanceof ExceptionA) {
                            // recover gracefully
                        }
                    });
}

void dangerousOperation() {
    throw new ExceptionA();
}

比方说,我在应用程序的许多地方都执行了此危险操作。在每个流中,我添加了一些特定于每个流的恢复代码。

我现在需要在危险操作中添加一个新错误:

void dangerousOperation() {
    Random random = new Random();
    if (random.nextBoolean()) {
        throw new ExceptionA();
    } else {
        throw new ExceptionB();
    }
}

此外,我想以无处不在的方式从ExceptionB中恢复。换句话说,我想以特定于流的方式处理ExceptionA,并以全局方式处理ExceptionB

有没有一种方法可以在每个 RxJava流之前将其“拦截”到错误中?++

如果我在每个onError中处理ExceptionB,那么我正在复制很多代码。如果我从每个流中完全删除onError块,仅依靠全局RxJavaPlugins.setErrorHandler(),我将无法以特定于流的方式处理ExceptionA


++或更高版本,根本没有传递到特定于流的错误处理程序,而是处理该流。

1 个答案:

答案 0 :(得分:0)

如何编写处理全局错误实现的函数,然后返回处理错误的状态。然后使用状态可以处理其他异常情况。

 boolean handleException(Exception error) {
     if (error instanceof ExceptionB) {
         // handle the global exception here
         return true;
     }
     return false;
 }

现在,从每个流错误实现中,您都可以调用上述函数来处理全局错误情况

 error -> {
       if (!handleException(error) {
              // handle the other specific cases here
       }
 });