Перехватывать только исключения определенного типа в RxJava 2

Я только изучаю RxJava 2, и я хотел бы перехватывать исключения только определенного типа и возвращать Observable. По сути, я хочу, чтобы onErrorResumeNext() перехватывала только определенный класс исключений, но похоже, что она так не работает.

Каковы мои варианты достижения такого поведения в RxJava 2? Просто использовать onErrorResumeNext(), обработать мое конкретное исключение и повторно сгенерировать остальные? Что-то типа:

.onErrorResumeNext(throwable -> throwable instanceof NotFoundException ? Observable.empty() : Observable.error(throwable));

person HolySamosa    schedule 21.02.2017    source источник
comment
Да, Function вариант onErrorResumeNext — это то, что вам нужно.   -  person akarnokd    schedule 21.02.2017
comment
Спасибо, @akarnokd. Я пытаюсь понять, почему onErrorResumeNext имеет подпись: onErrorResumeNext(Function<? super Throwable, ...>) Мне кажется, что нам нужно ? extends Throwable, а не ? super Throwable. Это позволило бы .onErrorResumeNext((NotNullException throwable) -> ..., что имеет смысл для меня, а не .onErrorResumeNext((Object throwable) -> ..., что не имеет смысла.   -  person HolySamosa    schedule 21.02.2017
comment
Система типов Java недостаточно мощна, чтобы выразить такой захват типа через лямбда.   -  person akarnokd    schedule 22.02.2017


Ответы (3)


Я бы вернул Observable.empty вместо просто null

.onErrorResumeNext(t -> t instanceof NullPointerException ? Observable.empty():Observable.error(t))
person paul    schedule 22.02.2017

Просто используйте состав:

public <T> Function<Throwable, Observable<T>> whenExceptionIsThenIgnore(Class<E> what) {
  return t -> {
    return what.isInstance(t) ? Observable.empty() : Observable.error(t);
  };
}

Затем используйте так:

Observable.from(...).flatMap(...)
.onErrorResumeNext(whenExceptionIsThenIgnore(IllegalArgumentException.class))
.onErrorResumeNext(whenExceptionIsThenIgnore(IOException.class))
...

См. также этот ответ выборочной обработки исключений.

person Tassos Bassoukos    schedule 21.02.2017

если вам нужна глобальная обработка ошибок, вы можете использовать RxJavaPlugins

RxJavaPlugins.setOnObservableAssembly(observable -> {
        if (observable instanceof ObservableError){
            return observable.doOnError(throwable -> {
                if(throwable instanceof SpecificException){
                    handleSpecificException();
                }
            });
        }
        return observable;
    });

(Аналогичный подход можно использовать для одиночных игр, Mays или Completables)

person Lukas    schedule 06.07.2018