2017-10-17 5 views
0

Observableには、flatMap()のような関数内で発生する例外をスローする方法がありますか? JavaではJavaが発生した場合にエラーをスローすることが可能です

は、通常の機能に、あなたはそれが例外をスローすることがあることを指定することができます

public void dangerousFunction() throws IOException {} 

flatMap()ようObservable機能の中で、私は同様の構文を見つけるように見えることはできません。私はこのようなtry/catchを使用することができます:

myObservable.flatMap(() -> { 
    try { 
     return dangerousFunction(); 
    } catch (IOException e) { 
     return Observable.error(e); 
    } 
}); 

それを書くためのより清潔な方法はありますか?たくさんの地図やObservablesがあると、多くのtry/catchブロックが自分のコードを乱してしまいます。

+0

この記事は役に立ちました:http://blog.danlew.net/2015/12/08/error-handling-in-rxjava/ – dementis

答えて

0

RxJava map()メソッドで例外を処理する標準的な方法は、catch-and-throwで例外を伝播することです。例:複数のmap()呼び出しにわたって繰り返されたときに、例えば、この動作をラップするためにヘルパーを定義することができるように

.map(b -> { 
    try { 
     ... 
    } catch (IOException ex) { 
     // manual catch and throw 
     throw new RuntimeException(ex); 

     // or catch-and-throw using a built-in helper 
     throw Exceptions.propagate(e); 
    } 
}) 

これは非常に冗長入手することができます

observable.map(RxMapWrapper.wrapAndThrow(new RxMapWrapper.Func1Wrapper<A, B>() { 
     @Override 
     public B call(A document) throws Exception { 
      // your map logic here ... 
     } 
    })) 

public class RxMapWrapper { 
    public static <T, R> Func1<T, R> wrapAndThrow(Func1Wrapper<T, R> caughtFunction) { 
     return t -> { 
      try { 
       return caughtFunction.call(t); 
      } catch (Exception e) { 
       throw Exceptions.propagate(e); 
      } 
     }; 
    } 

    public interface Func1Wrapper<T, R> extends Function { 
     R call(T t) throws Exception; 
    } 
} 
0

だけcatchブロック内Observable.error(e)を返したい場合は、すべてでキャッチ/試す必要はありません。例外は下流に行き、.subscribe(,throwable)はとにかくそれをキャッチします。

エラーが発生したときに他の/既定のオブジェクトを返す場合は、onErrorReturnItemonErrorResumeNextonErrorReturnの演算子を試してください。これはより清潔になります。

その他のオプションでは、Exceptionをスローする代わりに、このonErrorReturnItemメカニズムをメソッド自体に実装します。

関連する問題