Android 使用迭代器处理RxJava Zip运算符错误

Android 使用迭代器处理RxJava Zip运算符错误,android,rx-java,Android,Rx Java,背景 我有一个进程,它使用RxJava根据列表从不同的位置获取数据。每个项目都是通过不同的方法获得的(所有返回的观察值)。由于有N个项目要获取逻辑运算符,因此使用的是带迭代器的iszip 问题 下面的代码按预期工作,但我需要一个try catch块来捕获由getBigFoo()引发的异常,该异常返回一个footfoundexception,这似乎是“错误的”。其他与错误相关的运算符(如onErrorResumeNext()和onErrorReturn() 您可能需要使用延迟getBigFoo不应

背景

我有一个进程,它使用RxJava根据列表从不同的位置获取数据。每个项目都是通过不同的方法获得的(所有返回的观察值)。由于有N个项目要获取逻辑运算符,因此使用的是带迭代器的is
zip

问题

下面的代码按预期工作,但我需要一个
try catch
块来捕获由
getBigFoo()
引发的异常,该异常返回一个
footfoundexception
,这似乎是“错误的”。其他与错误相关的运算符(如
onErrorResumeNext()
onErrorReturn()


您可能需要使用
延迟
getBigFoo
不应引发异常,而是返回错误的
Observable
。因此,
defer
可能会帮助您解决此问题:

Observable<IBar> obs = Observable.defer(() -> {
             try {
                 return getBigFoo(foo.getId());
              } catch (Exception ex) {
                  return Observable.error(ex);
              } 
});
observablestoZip.add(obs);
Observable obs=可观测的延迟(()->{
试一试{
返回getBigFoo(foo.getId());
}捕获(例外情况除外){
返回可观测误差(ex);
} 
});
添加(obs);
您能让getBigFoo(foo.getId())抛出RuntimeException而不是Exception吗?。必须捕获管道上的所有异常,但不能捕获运行时异常

看看这个愚蠢的例子

         /**
 * Here is a silly example how runtimeExceptions are not needed
 */
@Test
public void observableRuntimeException() {
    Integer[] numbers = {0, 1, 2, 3, 4, 5};

    Observable.from(numbers)
              .doOnNext(number -> throwRuntimeException())
              .doOnError(t -> System.out.println("Expecting illegal argument exception:" + t.getMessage()))
              .subscribe();

}

private void throwRuntimeException() {
    throw new RuntimeException();
}

你可以在这里看到更多的例子

@dwursteisen找到了正确的答案,但并不完全正确

我的问题是我抛出了一个新的FoonNotFoundException:

throw new FooNotFoundException()
但我需要做的是:

return Observable.error(new FooNotFoundException());
然后在我的Zip函数中:

observablesToZip.add(getBigFoo(foo.getId())).onExceptionResumeNext(Observable.just(null);

使用上述组合意味着,在解决单个观测值时,整个序列不会中止并返回错误,并可能引发错误。

感谢您的回答,这不会将问题推到其他地方。但是,如果getBigFoo返回Observable.just(foo)或Observable.error(new footFoundException()),那么错误操作符不会捕捉到这一点吗?如果getBigFoo不抛出任何异常,而是返回一个Observable(Observable.just()或Observable.error()),那么延迟是无用的。我在这里使用defer只是为了模仿getBigFoo在我看来应该做的事情(即:不抛出任何异常)。好吧-那么假设getBigFoo返回Observable.error()如果没有try-catch块,我如何捕获它?你无法(捕获它)你将收到通知,这要感谢你的订阅者。或者您必须使用OneRorResumeNext来管理它。。。例如getBigFoo(id).onErrorResumeNext(Observable.empty());'FoonNotFoundException extends-IllegalArgumentException'可能会更新为extend
RuntimeException
-这将是一个尝试。只需尝试一下,没有骰子。doOnError未捕获异常,进程将崩溃。好主意。
return Observable.error(new FooNotFoundException());
observablesToZip.add(getBigFoo(foo.getId())).onExceptionResumeNext(Observable.just(null);