onErrorReturn в RxJava2 поймал только первую ошибку

Я выдал два исключения в потоке и использовал onErrorReturn, чтобы перехватить эти исключения. Но я обнаружил, что было поймано только первое исключение. Как перехватить все исключения?

Flowable.create(emitter -> {
    emitter.onError(new Exception("error1"));
    emitter.onError(new Exception("error2"));
    }, BackpressureStrategy.MISSING)
        .onErrorReturn(e -> {
            System.out.println("Got error " + e.getMessage());
            return "error";
        })
        .subscribe();

Выход:

Got error error1
io.reactivex.exceptions.UndeliverableException: java.lang.Exception: error2
    at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:349)
    at io.reactivex.internal.operators.flowable.FlowableCreate$BaseEmitter.onError(FlowableCreate.java:271)
    at com.example.springboottest.SimpleApplication.lambda$main$0(SimpleApplication.java:48)
    at io.reactivex.internal.operators.flowable.FlowableCreate.subscribeActual(FlowableCreate.java:72)
    at io.reactivex.Flowable.subscribe(Flowable.java:13094)
    at io.reactivex.internal.operators.flowable.FlowableOnErrorReturn.subscribeActual(FlowableOnErrorReturn.java:33)
    at io.reactivex.Flowable.subscribe(Flowable.java:13094)
    at io.reactivex.Flowable.subscribe(Flowable.java:13030)
    at io.reactivex.Flowable.subscribe(Flowable.java:12890)
    at com.example.springboottest.SimpleApplication.main(SimpleApplication.java:54)
Caused by: java.lang.Exception: error2
    ... 8 more
Exception in thread "main" io.reactivex.exceptions.UndeliverableException: java.lang.Exception: error2
    at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:349)
    at io.reactivex.internal.operators.flowable.FlowableCreate$BaseEmitter.onError(FlowableCreate.java:271)
    at com.example.springboottest.SimpleApplication.lambda$main$0(SimpleApplication.java:48)
    at io.reactivex.internal.operators.flowable.FlowableCreate.subscribeActual(FlowableCreate.java:72)
    at io.reactivex.Flowable.subscribe(Flowable.java:13094)
    at io.reactivex.internal.operators.flowable.FlowableOnErrorReturn.subscribeActual(FlowableOnErrorReturn.java:33)
    at io.reactivex.Flowable.subscribe(Flowable.java:13094)
    at io.reactivex.Flowable.subscribe(Flowable.java:13030)
    at io.reactivex.Flowable.subscribe(Flowable.java:12890)
    at com.example.springboottest.SimpleApplication.main(SimpleApplication.java:54)
Caused by: java.lang.Exception: error2
    ... 8 more

person Searene    schedule 18.04.2018    source источник


Ответы (1)


Observable заканчивается после завершения или обнаружения ошибки. Это часть контракта, и нет никакого способа обойти это имущество.

Единственный способ, которым вы могли бы обрабатывать «множественные» исключения в наблюдаемом, - это обрабатывать его как значение, а не как исключение. На практике это будет выглядеть как конструкция Scala Either.

person Kiskae    schedule 18.04.2018