Posted at

RxJavaのオペレーター内で例外をthrowする

More than 1 year has passed since last update.

RxJavaのmapなどのオペレーター内でチェック例外(Exception)をthrowしたい場合があったとしても、オペレーターのメソッドをオーバーライドしてるため、そのままでは例外をthrowすることができません。

そこで非チェック例外(RuntimeException)で包んであげることでthrowできるようになります。

RxJavaで用意されている、Exceptions.propagate を使うと良いと思います。ソースを見ると、単純にRuntimeExceptionに包んでるだけですが。


JSONExceptionの場合の例です。

JSONExceptionはチェック例外になるので、そのままではthrowできません。なので Exceptions.propagate を使っています。

Observable.just("{\"key\":\"value\"").map(new Func1<String, String>() {

@Override
public String call(String jsonString) {
try {
JSONObject json = new JSONObject(jsonString);
return json.getString("key");
} catch (JSONException e) {
// JSONExceptionをRuntimeExceptionで包んでthrowする
throw Exceptions.propagate(e);
}
}
}).subscribe(new Observer<String>() {
@Override
public void onCompleted() {
}

@Override
public void onError(Throwable e) {
// オペレーター内でthrowされた例外はここで処理する
e.printStackTrace();
}

@Override
public void onNext(String value) {
Log.d("TAG", value);
}
});