个人记录 RxJava2 错误处理操作符

onErrorReturn
Observable遇到错误时,触发onErrorReturn,它会发射一个特殊的项并调用onCompleted方法,忽略源Observable的onError,不会将错误传递给Observer

Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(ObservableEmitter<String> emitter) throws Exception {
        emitter.onError(new Throwable("发生错误"));
    }
}).onErrorReturn(new Function<Throwable, String>() {
    @Override
    public String apply(Throwable throwable) throws Exception {
        Log.d(TAG, "onErrorReturn " + throwable.getMessage());
        return "Observable发生错误";
    }
}).subscribe(new Observer<String>() {
    @Override
    public void onSubscribe(Disposable d) {

    }

    @Override
    public void onNext(String s) {
        Log.d(TAG, "onNext: " + s);
    }

    @Override
    public void onError(Throwable e) {
        Log.d(TAG, "onError: " + e.getMessage());
    }

    @Override
    public void onComplete() {
        Log.d(TAG, "onComplete");
    }
});

运行结果:
08-02 09:26:58.902 3063-3063/com.zhen.rxjavademo D/MainActivity-vv: onErrorReturn 发生错误
    onNext: Observable发生错误
    onComplete

onErrorResumeNext
当Obervable发生错误,触发onErrorResumeNext,不会将错误传递给Observer,它会发射备用的Observable作为代替

Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(ObservableEmitter<String> emitter) throws Exception {
        emitter.onError(new Throwable("发生错误"));
    }
}).onErrorResumeNext(new Function<Throwable, ObservableSource<? extends String>>() {
    @Override
    public ObservableSource<? extends String> apply(Throwable throwable) throws Exception {
        Log.d(TAG, "onErrorResumeNext: " + throwable.getMessage());
        return Observable.just("我是备用的Observable");
    }
}).subscribe(new Observer<String>() {
    @Override
    public void onSubscribe(Disposable d) {

    }

    @Override
    public void onNext(String s) {
        Log.d(TAG, "onNext: " + s);
    }

    @Override
    public void onError(Throwable e) {
        Log.d(TAG, "onError: " + e.getMessage());
    }

    @Override
    public void onComplete() {
        Log.d(TAG, "onComplete");
    }
});

运行结果:
08-02 09:41:06.599 3427-3427/com.zhen.rxjavademo D/MainActivity-vv: onErrorResumeNext: 发生错误
08-02 09:41:06.600 3427-3427/com.zhen.rxjavademo D/MainActivity-vv: onNext: 我是备用的Observable
08-02 09:41:06.601 3427-3427/com.zhen.rxjavademo D/MainActivity-vv: onComplete

onExceptionResumeNext
与onErrorResumeNext类似,不同的是它接收的是Exception,如果接收到的是Throwable它会将错误传递给Observer的onError方法,不会使用备用的Observable

Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(ObservableEmitter<String> emitter) throws Exception {
        emitter.onError(new Exception("我是异常"));
    }
}).onExceptionResumeNext(new ObservableSource<String>() {
    @Override
    public void subscribe(Observer<? super String> observer) {
        observer.onNext("我是备用Observable");
        observer.onComplete();
    }
}).subscribe(new Observer<String>() {
    @Override
    public void onSubscribe(Disposable d) {

    }

    @Override
    public void onNext(String s) {
        Log.d(TAG, "onNext: " + s);
    }

    @Override
    public void onError(Throwable e) {
        Log.d(TAG, "onError: " + e.getMessage());
    }

    @Override
    public void onComplete() {
        Log.d(TAG, "onComplete: ");
    }
});

运行结果:
08-02 09:48:46.767 4093-4093/com.zhen.rxjavademo D/MainActivity-vv: onNext: 我是备用Observable
    onComplete:

猜你喜欢

转载自blog.csdn.net/NianandShao/article/details/81353099