doOnError没有捕获异常

时间:2017-01-06 15:04:13

标签: java android rx-java rx-android

我刚刚开始使用RxJava,但也许还没有点击。

1

Integer[] items = {1, 2, 3, 0, 0, 4, 5, 6, 1};
Observable.from(items)
        .map(this::invert)
        .subscribe(i -> Log.d(LOG_TAG, "Inverted: " + i), t -> Log.d(LOG_TAG, "Error: " + t.getMessage()));

2

Integer[] items = {1, 2, 3, 0, 0, 4, 5, 6, 1};
Observable.from(items)
        .map(this::invert)
        .doOnError(t -> Log.d(LOG_TAG, "Error: " + t.getMessage()))
        .doOnNext(i -> Log.d(LOG_TAG, "Inverted: " + i))
        .subscribe();

invert功能:

int invert(int i) {
    return 1 / i;
}

第一个正常执行,当抛出异常时,执行onError。但另一方面,第二个不起作用,所以异常一直抛到调用方法。

两个代码块之间有什么区别?

1 个答案:

答案 0 :(得分:8)

请记住.doOnError()捕获异常,对其进行操作然后重新抛出。如果您想要不同的行为,请使用.onError*方法之一。

现在,异常没有传播到#1中的调用者而是传播到#2的原因是你在#1中提供了错误处理程序,但在#2中没有,在这种情况下默认情况下是是传播异常。