質問: 4) { emitter.onError(new ApiBusinessErrorException("AA0099E", new String[]{response.readEntity(SSOError.class).getErrorMessage()})); } else { emitter.onSuccess(response); } }).retry((integer, throwable) -> { if (throwable instanceof ApiBusinessErrorException) return false; else { if(integer >= 3){ return false; } Thread.sleep(1000); return true; } }).blockingGet(); ``` APIをリクエストする部分は MyClient で実装されています。 MyClient には以下の制限があります(SDKの制限) * 4XX系は Response にステータスコードがセットされる * 5XX系は Exception が throw される また、APIをリクエスト側(本コード)には以下の要件があります。 * 4XX系はリトライせず、1回目のエラーで ApiBusinessErrorException を throw する * 5XX系は1秒インターバルで3回までリトライし、それでもエラーだった場合は SystemErrorException を throw する 上記コードの場合、RuntimeException(4XX系)またはProcessingException(5XX系)のエラーが throw されてしまって、自前の Exception(ApiBusinessErrorException/SystemErrorException)を throw できません。 ``` .subscribe(i -> { }, e -> { throw SystemErrorException }); ``` 最後の blockingGet の部分を上記のように変えた場合、CompositeException が throw されました(中身には自前の Exception が入っていました)。 純粋に自前の Exception を呼び出し元に throw する方法はありますでしょうか?
回答: 試してみたところ `blockingGet()` すると、例外が `RuntimeException` でラップされる仕様っぽいですね。 `subscribe` で目的の処理を行うのが Rx の一般的なやり方なので、 `subscribe( , ex -> { })` の `ex` は目的の例外が取得できているなら、そこで行うのが良いかと思います。 見た感じ `client.realm(realmName).users().create(user)` はブロッキング処理のようですし、 `blockingGet()` もブロッキングAPIなので、この処理自体を RxJava で行う必要性は低いかなと思いました。