RxJava操作符-异常处理系

一般情况下,RxJava产生的一切异常,都会传递至onError进行处理。但在有些情况下,我们需要在onError之前捕获这些异常并作相应的处理,此时就用到了RxJava的Error Handling系列操作符。

RxJava的Error Handing系列操作符有3个:

  • onErrorReturn
  • onErrorResumeNext
  • onExceptionResumeNext

onErrorReturn(Func1)


RxJava操作符-异常处理系_第1张图片

The onErrorReturn method returns an Observable that mirrors the behavior of the source Observable, unless that Observable invokes onError in which case, rather than propagating that error to the observer, onErrorReturn will instead emit a specified item and invoke the observer’s onCompleted method.

以上为doc说明,说白了就是该操作符会拦截(拦截指的是不会触发onError,下同)发送给观察者的异常,并发送出一个正常的item,这个item需要我们自己在Func1中自定义。

.onErrorReturn(new Func1() { 
    @Override 
    public Object call(Throwable throwable) { 
        // TODO: handle throwable then return specified object 
        return null; 
    }
})

onErrorResumeNext(Func1)

onErrorResumeNext(Observable)


RxJava操作符-异常处理系_第2张图片

The onErrorResumeNext method returns an Observable that mirrors the behavior of the source Observable, unless that Observable invokes onError in which case, rather than propagating that error to the observer, onErrorResumeNext will instead begin mirroring a second, backup Observable.

同样是产生源Observable的镜像,拦截异常,并向事件流发射一个Observable,可直接传入一个Observable对象,或由Func1生成。

onExceptionResumeNext(Observable)


RxJava操作符-异常处理系_第3张图片

Much like onErrorResumeNext method, this returns an Observable that mirrors the behavior of the source Observable, unless that Observable invokes onError in which case, if the Throwable passed to onError is an Exception, rather than propagating that Exception to the observer, onExceptionResumeNext will instead begin mirroring a second, backup Observable. If the Throwable is not an Exception, the Observable returned by onExceptionResumeNext will propagate it to its observer’s onError method and will not invoke its backup Observable.

和onErrorResumeNext很像,只不过此操作符拦截的是Exception,并且参数只能是Observable对象。需注意的是,如果产生的Throwable不是Exception,会被发送至由onExceptionResumeNext返回的Observable所注册的Observer中,而不会调用backup Observable(这个backup是指的什么,源Obervable吗?)。

doOnError(Action1)


这个操作符并不在官方文档的Error Handling系列中,而属于Do系列,和Error Handling系列不同,doOnError并不会拦截异常,只是通过Action1回掉传入Thorwable,该Throwable还是会发送至onError。

之所以放在这里一起说,是因为我在开发时需要在返回未登陆异常的时候,清除一下本地的UserCache,异常还是需要被正常发送给观察者。最开始还用onErrorReturn去处理,完成后再手动抛出一个RuntimeException,结果导致产生其他Exception或Throwable时不能得到正确处理,真是傻透了。

你可能感兴趣的:(RxJava操作符-异常处理系)