Java. Наблюдайте за ошибкой, если это произойдет.

88
8

Есть ли способ, чтобы Observable просто генерировал исключение, которое происходит из функции, такой как flatMap()?

В Java, в нормальной функции, вы можете указать, что она может вызвать исключение:

public void dangerousFunction() throws IOException {}

В функции Observable такой как flatMap(), я не могу найти аналогичный синтаксис. Я могу использовать try/catch следующим образом:

myObservable.flatMap(() -> {
try {
return dangerousFunction();
} catch (IOException e) {
return Observable.error(e);
}
});

Есть ли более чистый метод для написания этого? Если у меня много карт и/или Observables, это приводит к тому, что многие блоки try/catch загромождают мой код.

спросил(а) 2021-01-25T13:51:14+03:00 4 месяца, 2 недели назад
1
Решение
77

Стандартный подход к устранению исключений в методе RxJava map() распространяет исключение методом catch-and-throw. Например:

.map(b -> {
try {
...
} catch (IOException ex) {
// manual catch and throw
throw new RuntimeException(ex);

// or catch-and-throw using a built-in helper
throw Exceptions.propagate(e);
}
})


Это может быть довольно многословным, если повторить несколько вызовов map() чтобы вы могли определить помощника, чтобы обернуть это поведение, например

observable.map(RxMapWrapper.wrapAndThrow(new RxMapWrapper.Func1Wrapper<A, B>() {
@Override
public B call(A document) throws Exception {
// your map logic here ...
}
}))

public class RxMapWrapper {
public static <T, R> Func1<T, R> wrapAndThrow(Func1Wrapper<T, R> caughtFunction) {
return t -> {
try {
return caughtFunction.call(t);
} catch (Exception e) {
throw Exceptions.propagate(e);
}
};
}

public interface Func1Wrapper<T, R> extends Function {
R call(T t) throws Exception;
}
}

ответил(а) 2021-01-25T13:51:14+03:00 4 месяца, 2 недели назад
45

Если вы хотите только вернуть Observable.error(e) внутри блоков catch, вам вообще не требуется try/catch. Исключение будет идти вниз по течению, и .subscribe(,throwable) поймает его в любом случае.

Если вы хотите вернуть другой объект/объект по умолчанию при возникновении ошибки, попробуйте следующие операторы: onErrorReturnItem, onErrorResumeNext, onErrorReturn. Это было бы чище.

Другой вариант - реализовать этот механизм onErrorReturnItem в ваших методах, а не бросать Exception.

ответил(а) 2021-01-25T13:51:14+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема