rxjava catch java system.reactive rx-java

rxjava catch



¿Cómo funcionan RxJava doOnError y onErrorReturn? (1)

Tanto doOnError como onErrorReturn devuelven un nuevo Observable con el comportamiento modificado. Estoy de acuerdo en que la documentación de ellos puede ser un poco engañosa. Modifique sus pruebas como esta para obtener el comportamiento esperado:

// This one outputs "subscribe.onError" @Test public void observable_doOnError_subscribingToError() throws InterruptedException { Observable<String> obs = getErrorProducingObservable() .doOnError(throwable -> System.out.println("doOnError")); obs.subscribeOn(Schedulers.immediate()).observeOn(Schedulers.immediate()).subscribe( s -> {}, error -> System.out.println("subscribe.onError") ); Thread.sleep(300); } // This one outputs "subscribe.onError" @Test public void observable_onErrorReturn() throws InterruptedException { Observable<String> obs = getErrorProducingObservable() .onErrorReturn(throwable -> "Yeah I got this"); obs.subscribeOn(Schedulers.immediate()).observeOn(Schedulers.immediate()).subscribe( s -> System.out.println("got: " + s), error -> System.out.println("subscribe.onError") ); Thread.sleep(300); } private Observable<String> getErrorProducingObservable() { return Observable.create(subscriber -> { subscriber.onError(new RuntimeException("Somebody set up us the bomb")); }); }

Hice estas pruebas unitarias, y el resultado no es lo que esperaba en absoluto:

// This one outputs "subscribe.onError" @Test public void observable_doOnError_subscribingToError() throws InterruptedException { Observable<String> obs = getErrorProducingObservable(); obs.doOnError(throwable -> System.out.println("doOnError")); obs.subscribeOn(Schedulers.immediate()).observeOn(Schedulers.immediate()).subscribe( s -> {}, error -> System.out.println("subscribe.onError") ); Thread.sleep(300); } // This one outputs "subscribe.onError" @Test public void observable_onErrorReturn() throws InterruptedException { Observable<String> obs = getErrorProducingObservable(); obs.onErrorReturn(throwable -> "Yeah I got this"); obs.subscribeOn(Schedulers.immediate()).observeOn(Schedulers.immediate()).subscribe( s -> System.out.println("got: " + s), error -> System.out.println("subscribe.onError") ); Thread.sleep(300); } private Observable<String> getErrorProducingObservable() { return Observable.create(subscriber -> { subscriber.onError(new RuntimeException("Somebody set up us the bomb")); }); }

Entonces, tanto la salida "subscribe.onError" - ni doOnError ni onErrorReturn parecen ser llamados.

doOnError se documenta como:

Modifica el origen observable para que invoque una acción si llama a error.

No estoy seguro de cómo interpretar eso, pero esperaba que "doOnError" se imprimiera o "doOnError" seguido de "subscribe.onError".

onErrorReturn se documenta como:

Indica a un Observable que emita un elemento (devuelto por una función específica) en lugar de invocar a Onrror si encuentra un error.

Por lo tanto, esperaba "got: Yeah I got this" como resultado de la última prueba.

¿Lo que da?