Rxjava温故知新(七)------RxJava异常型操作符

本文深入探讨RxJava中三种错误处理操作符:onErrorResumeNext、onErrorReturn与onExceptionResumeNext的功能与用法。通过具体代码示例,解析它们如何在不同级别异常下拦截与处理错误,提供默认值或继续发送数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.操作符

  • onErrorResumeNext
  • onErrorReturn
  • onExceptionResumeNext

2.操作符案例

2.1 onErrorResumeNext

说明

拦截发射的异常  ,能够处理 throw Exception级别的异常,能够接收异常消息,需要返回一个新的Observable,执行发送 ,不能处理 throw Error级别异常

例子

Observable.create(new ObservableOnSubscribe<String>() {
        @Override
        public void subscribe(ObservableEmitter<String> emitter) throws Exception {
            emitter.onNext("1");
            emitter.onNext("2");
            emitter.onNext("3");
            throw new RuntimeException("hahahhaa"); // 下游onErrorResumeNext 能够处理
	//                throw new IllegalAccessError("hahahhaa"); //下游onErrorResumeNext 不能处理

        }
    })
            .onErrorResumeNext(new Function<Throwable, ObservableSource<? extends String>>() {
                @Override
                public ObservableSource<? extends String> apply(Throwable throwable) throws Exception {
                    throwable.printStackTrace();
                    return Observable.create(new ObservableOnSubscribe<String>() {
                        @Override
                        public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                            emitter.onNext("4");
                            emitter.onNext("5");
                            emitter.onNext("6");
                        }
                    });
                }
            })
            .subscribe(new Observer<String>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

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

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

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

输出信息 (发送完成以后 手动抛出异常,能够被onErrorResumeNext 捕获,并且在里面创建了一个新的Observable,继续发送)

10-25 05:50:17.772 I/MainActivity: onNext: 1
10-25 05:50:17.772 I/MainActivity: onNext: 2
10-25 05:50:17.772 I/MainActivity: onNext: 3
10-25 05:50:17.772 W/System.err: java.lang.RuntimeException: hahahhaa
10-25 05:50:17.772 W/System.err:     at com.xiaxiayige.rxjavademo.MainActivity$36.subscribe(MainActivity.java:719)
10-25 05:50:17.772 W/System.err:     at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:40)
10-25 05:50:17.772 W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:12267)
10-25 05:50:17.772 W/System.err:     at io.reactivex.internal.operators.observable.ObservableOnErrorNext.subscribeActual(ObservableOnErrorNext.java:38)
10-25 05:50:17.772 W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:12267)
10-25 05:50:17.772 W/System.err:     at com.xiaxiayige.rxjavademo.MainActivity.aa24(MainActivity.java:738)
10-25 05:50:17.772 W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
10-25 05:50:17.772 W/System.err:     at java.lang.reflect.Method.invoke(Method.java:511)
10-25 05:50:17.772 W/System.err:     at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
10-25 05:50:17.772 W/System.err:     at android.view.View.performClick(View.java:4204)
10-25 05:50:17.772 W/System.err:     at android.view.View$PerformClick.run(View.java:17355)
10-25 05:50:17.772 W/System.err:     at android.os.Handler.handleCallback(Handler.java:725)
10-25 05:50:17.772 W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:92)
10-25 05:50:17.772 W/System.err:     at android.os.Looper.loop(Looper.java:137)
10-25 05:50:17.772 W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5041)
10-25 05:50:17.772 W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
10-25 05:50:17.772 W/System.err:     at java.lang.reflect.Method.invoke(Method.java:511)
10-25 05:50:17.772 W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
10-25 05:50:17.772 W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
10-25 05:50:17.772 W/System.err:     at dalvik.system.NativeStart.main(Native Method)
10-25 05:50:17.772 I/MainActivonErrorResumeNextity: onNext: 4
10-25 05:50:17.772 I/MainActivity: onNext: 5
10-25 05:50:17.772 I/MainActivity: onNext: 6

2.2 onErrorReturn

说明

拦截发射的异常,能够处理 throw Execption级别异常 ,能够接收异常消息,可以提供返回一个默认值,但是不能处理 throw Error级别异常

例子

Observable.create(new ObservableOnSubscribe<String>() {
        @Override
        public void subscribe(ObservableEmitter<String> emitter) throws Exception {
            emitter.onNext("1");
            emitter.onNext("2");
            emitter.onNext("3");
            throw new RuntimeException("hahahhaa"); //  下游onErrorReturn 能够处理
//                throw new IllegalAccessError("hahahhaa"); //下游onErrorResumeNext 不能处理
        }
    })
            .onErrorReturn(new Function<Throwable, String>() {
                @Override
                public String apply(Throwable throwable) throws Exception {
                    throwable.printStackTrace();
                    return "default";
                }
            })
            .subscribe(new Observer<String>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

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

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

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

输出结果

10-25 05:56:24.220 I/MainActivity: onNext: 1
10-25 05:56:24.220 I/MainActivity: onNext: 2
10-25 05:56:24.220 I/MainActivity: onNext: 3
10-25 05:56:24.220 W/System.err: java.lang.RuntimeException: hahahhaa
10-25 05:56:24.224 W/System.err:     at com.xiaxiayige.rxjavademo.MainActivity$39.subscribe(MainActivity.java:769)
10-25 05:56:24.224 W/System.err:     at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:40)
10-25 05:56:24.224 W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:12267)
10-25 05:56:24.224 W/System.err:     at io.reactivex.internal.operators.observable.ObservableOnErrorReturn.subscribeActual(ObservableOnErrorReturn.java:31)
10-25 05:56:24.224 W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:12267)
10-25 05:56:24.224 W/System.err:     at com.xiaxiayige.rxjavademo.MainActivity.aa25(MainActivity.java:780)
10-25 05:56:24.224 W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
10-25 05:56:24.224 W/System.err:     at java.lang.reflect.Method.invoke(Method.java:511)
10-25 05:56:24.224 W/System.err:     at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
10-25 05:56:24.224 W/System.err:     at android.view.View.performClick(View.java:4204)
10-25 05:56:24.224 W/System.err:     at android.view.View$PerformClick.run(View.java:17355)
10-25 05:56:24.228 W/System.err:     at android.os.Handler.handleCallback(Handler.java:725)
10-25 05:56:24.228 W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:92)
10-25 05:56:24.228 W/System.err:     at android.os.Looper.loop(Looper.java:137)
10-25 05:56:24.228 W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5041)
10-25 05:56:24.228 W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
10-25 05:56:24.228 W/System.err:     at java.lang.reflect.Method.invoke(Method.java:511)
10-25 05:56:24.228 W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
10-25 05:56:24.228 W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
10-25 05:56:24.228 W/System.err:     at dalvik.system.NativeStart.main(Native Method)
10-25 05:56:24.228 I/MainActivity: onNext: default
10-25 05:56:24.228 I/MainActivity: onComplete: 

2.3 onExceptionResumeNext

说明

拦截发射的异常,能够处理 throw Execption级别异常 不接受异常信息,获得Observer继续发送,同样不能处理 Error级别的异常

例子

Observable.create(new ObservableOnSubscribe<String>() {
        @Override
        public void subscribe(ObservableEmitter<String> emitter) throws Exception {
            emitter.onNext("1");
            emitter.onNext("2");
            emitter.onNext("3");
                throw new RuntimeException("hahahhaa"); //  下游onErrorReturn 能够处理
//            throw new IllegalAccessError("hahahhaa"); //下游onErrorResumeNext 不能处理
        }
    })
            .onExceptionResumeNext(new ObservableSource<String>() {
                @Override
                public void subscribe(Observer<? super String> observer) {
                    observer.onNext("4");
                    observer.onNext("5");
                    observer.onNext("6");
                }
            })
            .subscribe(new Observer<String>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

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

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

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

输出结果 这里抛出了异常,但是接收的地方并没有告知是什么异常,我们可以不用处理。正常执行我们的操作即可

10-25 05:54:48.004 I/MainActivity: onNext: 1
10-25 05:54:48.004 I/MainActivity: onNext: 2
10-25 05:54:48.004 I/MainActivity: onNext: 3
10-25 05:54:48.004 I/MainActivity: onNext: 4
10-25 05:54:48.004 I/MainActivity: onNext: 5
10-25 05:54:48.004 I/MainActivity: onNext: 6

3.总结对比

1. 都不能处理Error级别的错误,
2. 都能拦截到上游的异常
onErrorResumeNext 拦截发射的异常  ,能够处理 throw Exception级别的异常,能够接收异常消息,需要返回一个新的Observable,执行发送 ,不能处理 throw Error级别异常
onErrorReturn     拦截发射的异常,能够处理 throw Execption级别异常 ,能够接收异常消息,可以提供返回一个默认值,但是不能处理 throw Error级别异常
onExceptionResumeNext     拦截发射的异常,能够处理 throw Execption级别异常 不接受异常信息,获得Observer继续发送,同样不能处理 Error级别的异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值