Android 使用迭代器处理RxJava Zip运算符错误
背景 我有一个进程,它使用RxJava根据列表从不同的位置获取数据。每个项目都是通过不同的方法获得的(所有返回的观察值)。由于有N个项目要获取逻辑运算符,因此使用的是带迭代器的isAndroid 使用迭代器处理RxJava Zip运算符错误,android,rx-java,Android,Rx Java,背景 我有一个进程,它使用RxJava根据列表从不同的位置获取数据。每个项目都是通过不同的方法获得的(所有返回的观察值)。由于有N个项目要获取逻辑运算符,因此使用的是带迭代器的iszip 问题 下面的代码按预期工作,但我需要一个try catch块来捕获由getBigFoo()引发的异常,该异常返回一个footfoundexception,这似乎是“错误的”。其他与错误相关的运算符(如onErrorResumeNext()和onErrorReturn() 您可能需要使用延迟getBigFoo不应
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'可能会更新为extendRuntimeException
-这将是一个尝试。只需尝试一下,没有骰子。doOnError未捕获异常,进程将崩溃。好主意。
return Observable.error(new FooNotFoundException());
observablesToZip.add(getBigFoo(foo.getId())).onExceptionResumeNext(Observable.just(null);