如果我有一个Observalbe:RxJava Observable和Subscriber用于跳过异常?
List<Integer> ints = Lists.newArrayList(1, 2, 0, 3, 4);
Observable<Integer> o1 = Observable.from(ints);
我想12生成另一个观察到,这鸿沟:
Observable<Integer> o2 = o1.map(i -> 12/i);
o2.subscribe(
v -> logger.info ("Subscriber value {}", v) ,
t -> logger.error("Subscriber onError {} : {}", t.getClass() , t.getMessage())
);
很明显它会得到错误,当它遇到停止“0”:
RxTest - Subscriber value 12
RxTest - Subscriber value 6
RxTest - Subscriber onError class java.lang.ArithmeticException :/by zero
但是如果我想让观察者(o2)跳过异常呢?
我看着RxJava的文档error handling,没有办法跳过这个错误。 onErrorResumeNext()
和onExceptionResumeNext()
需要备份/备份Observable
,这不是我想要的。 onErrorReturn
需要指定返回值。
所有三种错误处理方法都无法恢复原始观察者。例如:
Observable<Integer> o2 = o1.map(i -> 12/i)
.onErrorReturn(t -> 0);
它打印:
RxTest - Subscriber value 12
RxTest - Subscriber value 6
RxTest - Subscriber value 0
不打印剩下的12/3 12/4和
唯一的解决办法似乎继电器在map
功能:
Observable<Integer> o2 = o1.map(i -> {
try {
return Optional.of(12/i);
} catch (ArithmeticException e) {
return Optional.empty();
}
}).filter(Optional::isPresent)
.map(o -> (Integer) o.get());
它的工作,但它很麻烦。我不知道是否操纵Observable
(如map
)
以上是关于Observable
跳过异常时,有什么办法可以轻松地跳过任何RuntimeException
。以下是有关在Subscriber
跳过例外:
的情况是一样的:
List<Integer> ints = Lists.newArrayList(1, 2, 0 , 3 , 4);
Observable<Integer> o1 = Observable.from(ints);
o1.subscribe(
i -> logger.info("12/{} = {}", i, 12/i),
t -> logger.error("{} : {}", t.getClass() , t.getMessage()),
() -> logger.info("onCompleted")
);
它打印出:
当例外onNext
发生时,它会触发onError
和NOT响应Observable
的任何数据。如果我希望订户吞下异常,我必须尝试捕捉onNext()
中的ArithmeticException
。有没有更清洁的解决方案?
看来当Subscriber
在onNext()
面临错误,在(onNext
)内无法处理时,它应该停止,对吧?这是一个好的设计吗?
我看它的样子,'onNext()'等同于'Iterator.next()' - 当有迭代集合的问题 - 将抛出一个异常,并迭代捞出(它不't“resume”iterating) - 例如,请参阅[ConcurrentModificationException](http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html)。这与我们在这里的行为是一样的。也就是说,@benjchristensen或许能够对这个问题有更多的了解 – alfasin 2015-02-08 05:27:20
“可选”映射可能是我最喜欢的处理方式。这很清楚,过滤器很好地消化了事件。封装它是一个很好的方法。我会在scala中使用'Try'类型,然后进行过滤。 – BeepDog 2018-02-21 21:49:31