2014-10-07 113 views
15

我有5 Observable s它与flatMap链接。如果前四个Observable s产生一个Exception我想传播一个不同类型的Exception到第五个。RxJava链观察和错误处理(自定义异常传播)

它是如何实现的?

谢谢。

P.S. 我想出这个尚未检验的解决方案:

flatMap(
     // onNext 
     new Func1<BoolResponse, Observable<?>>() { 
      @Override 
      public Observable<?> call(BoolResponse boolResponse) { 
       return request; 
      } 
     }, 
     // onError 
     new Func1<Throwable, Observable<?>>() { 
      @Override 
      public Observable<?> call(Throwable throwable) { 
       return Observable.error(new SomethingWentWrong()); 
      } 
     }, 
     // onCompleted 
     new Func0<Observable<?>>() { 
      @Override 
      public Observable<?> call() { 
       return request; 
      } 
}); 

你认为这是OK?

回答

27

你要寻找的是onErrorResumeNext,这将让你赶上从光源发出任何Throwable,让您无论是一个新的观察或其他Observable这将发出不同Throwable恢复。

... 
    .flatMap(...) 
    .flatMap(...) 
    .onErrorResumeNext(new Func1<Throwable, Observable<?>>() { 
     @Override 
     public Observable<?> call(Throwable throwable) { 
      // Here simply return an Observable which will emit the Throwable of your liking 
      return Observable.error(new Throwable(...)); 
     } 
    }) 
    .flatMap(...); 

记住flatMap是一个运营商来处理你的数据流,但它不会让你处理onError在你的代码示例。您可以在您订阅流的的onError回调中处理错误。