Рассмотрим следующий пример:
Observable.range(1, 10).subscribe(i -> {
System.out.println(i);
if (i == 5) {
throw new RuntimeException("oops!");
}
}, Throwable::printStackTrace);
Это выводит номера от 1 до 5, а затем печатает исключение.
Я хочу добиться того, чтобы наблюдатель оставался подписанным и продолжал работать после выброса исключения, т.е. печатал все числа от 1 до 10.
Я попытался использовать retry()
и другие различные операторы обработки ошибок, но, как сказано в документации, их целью является обработка ошибок испускаемый наблюдаемым.
Самое простое решение - просто обернуть все тело onNext
в блок try-catch, но это не похоже на хорошее решение для меня. В подобном вопросе Rx.NET предлагаемое решение состояло в том, чтобы создать метод расширения, который мог бы сделать обертку, создав прокси-наблюдаемое. Я попытался переделать его:
Observable<Integer> origin = Observable.range(1, 10);
Observable<Integer> proxy = Observable.create((Observable.OnSubscribe<Integer>) s ->
origin.subscribe(i -> {try { s.onNext(i); } catch (Exception ignored) {}}, s::onError, s::onCompleted));
proxy.subscribe(i -> {
System.out.println(i);
if (i == 5) {
throw new RuntimeException("oops!");
}
}, Throwable::printStackTrace);
Это ничего не меняет, потому что сам RxJava переносит подписчика на SafeSubscriber
. Использование unsafeSubscribe
, чтобы обойти это, похоже, не является хорошим решением.
Что я могу сделать для решения этой проблемы?