Наблюдения за цепочкой RxJava и обработка ошибок (обычное распространение исключений)

У меня есть 5 Observable, которые связаны с flatMap. В случае, если первые четыре Observable производят Exception, я хочу распространять другой тип Exception на пятый.

Как это достигается?

Спасибо.

P.S. Я придумал это еще непроверенное решение:

flatMap(
        // onNext
        new Func1<BoolResponse, Observable<?>>() {
            @Override
            public Observable<?> call(BoolResponse boolResponse) {
                return request;
            }
        },
        // onError
        new Func1<Throwable, Observable<?>>() {
            @Override
            public Observable<?> call(Throwable throwable) {
                return Observable.error(new SomethingWentWrong());
            }
        },
        // onCompleted
        new Func0<Observable<?>>() {
            @Override
            public Observable<?> call() {
                return request;
            }
});

Считаете ли вы это хорошо?

Ответы

Ответ 1

То, что вы ищете, это onErrorResumeNext, которое позволит вам поймать любой Throwable, испущенный из источника, и позволит вам либо возобновить работу с новым Observable, либо другим Observable, который выдаст другой Throwable.

    ...
    .flatMap(...)
    .flatMap(...)
    .onErrorResumeNext(new Func1<Throwable, Observable<?>>() {
        @Override
        public Observable<?> call(Throwable throwable) {
            // Here simply return an Observable which will emit the Throwable of your liking
            return Observable.error(new Throwable(...));
        }
    })
    .flatMap(...);

Имейте в виду, что flatMap - это оператор для обработки потока данных, но он не позволит вам обрабатывать onError в вашем примере кода. Вы можете обработать ошибку в своем обратном вызове Observer onError, где вы подписаны на поток.