android doOnError不会捕获异常

dldeef67  于 2023-04-18  发布在  Android
关注(0)|答案(2)|浏览(143)

我刚刚开始使用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。但另一方面,第二个不工作,所以异常一直被抛出到调用方法。
这两个代码块有什么区别?

3ks5zfa0

3ks5zfa01#

请记住,.doOnError()捕获异常,对它做一些事情 *,然后重新抛出它 *。如果您想要不同的行为,请使用.onError*方法之一。
现在,为什么异常在#1中没有传播到调用者,而在#2中传播到调用者,原因是您在#1中提供了错误处理程序,但在#2中没有,在这种情况下,默认情况是传播异常。

a1o7rhls

a1o7rhls2#

完成Tassos的回答:
RxJava不允许异常“冒泡”。如果一个异常在没有被捕获的情况下逃逸了执行链,而不是将其传播到您的调用代码,Rx将捕获它并记录一个错误消息,如onErrorDropped reactor.core.Exceptions$ErrorCallbackNotImplemented: <your exeception and message here>。参见https://github.com/reactor/reactor-core/issues/2677
正如Tassos所说,异常是从doOnError()重新抛出的。

Observable.from(items)
    .map(this::invert)
    .doOnError(t -> Log.d(LOG_TAG, "Error: " + t.getMessage()))
    .onErrorResume(e -> Mono.empty()) // Replace Mono.empty() with an alternative function if you want some behavior on error
    .doOnNext(i -> Log.d(LOG_TAG, "Inverted: " + i))
    .subscribe();

有关onErrorX如何工作的更多详细信息,请参阅https://nickolasfisher.com/blog/Making-Sense-of-Mono-Error-Handling-in-Spring-Boot-WebfluxProject-Reactor

相关问题