Наблюдаемые цепочки 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;
            }
});

Как вы думаете, это нормально?


person midnight    schedule 07.10.2014    source источник


Ответы (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 в вашем примере кода. Вы можете обработать ошибку в обратном вызове onError вашего Observer, где вы подписываетесь на поток.

person Miguel    schedule 07.10.2014