2017-01-06 7 views
3

私はRxJavaを使い始めていますが、まだクリックしていないものがあります。doOnErrorは例外をキャッチしません

Integer[] items = {1, 2, 3, 0, 0, 4, 5, 6, 1}; 
Observable.from(items) 
     .map(this::invert) 
     .subscribe(i -> Log.d(LOG_TAG, "Inverted: " + i), t -> Log.d(LOG_TAG, "Error: " + t.getMessage())); 

Integer[] items = {1, 2, 3, 0, 0, 4, 5, 6, 1}; 
Observable.from(items) 
     .map(this::invert) 
     .doOnError(t -> Log.d(LOG_TAG, "Error: " + t.getMessage())) 
     .doOnNext(i -> Log.d(LOG_TAG, "Inverted: " + i)) 
     .subscribe(); 

invert機能:

int invert(int i) { 
    return 1/i; 
} 

通常最初に実行し、例外がスローされますonErrorが実行されます。しかし、一方では、2番目のメソッドは機能しません。したがって、例外は呼び出し元のメソッドまですべてスローされます。

2つのコードブロックの違いは何ですか?

+1

注: '1/0'は' Error'としてトリガしますが、ここでは問題ではありません。 –

答えて

4

.doOnError()は例外をキャッチし、それにはを実行してから、を再スローします。別の動作が必要な場合は、.onError*のいずれかのメソッドを使用します。

#1では呼び出し元に伝播せず#2で例外が伝播する理由は、#1ではエラーハンドラが提供されていますが、#2ではエラーハンドラが提供されていないためです。例外を伝播します。

関連する問題