Rxjava异常操作符

本文深入解析RxJava中用于处理异常的多种操作符,包括Catch、onErrorReturnItem、onErrorReturn、onErrorResumeWith等,通过实例演示如何在数据流中优雅地处理错误。
摘要由CSDN通过智能技术生成

Rxjava操作符索引

这篇章主要介绍Rxjava的异常操作符

目录

Catch

onErrorReturnItem

onErrorReturn

onErrorResumeWith

onErrorResumeNext

Retry

retry

retryUntil


Catch

主要拦截原始Observable的onError通知,替换成为其他数据项或数据列。

onErrorReturnItem

让observable遇到错误时发射一个指定数据项并正常终止

Observable observable = Observable.create(observableEmitter -> {
            for (int i = 0; i < 5; i++){
                if (i == 2){
                    observableEmitter.onError(new Exception("异常测试"));
                }else{
                    observableEmitter.onNext(i+"");
                }
            }
            observableEmitter.onComplete();
        });
observable.onErrorReturnItem(-1).subscribe(num -> System.out.println(num+"*"));

结果:

0*
1*
-1*

看到代码就明白了,我设置发射数据等于2的时候报异常,然后异常的时候就打印了-1

onErrorReturn

这个跟上面的区别的是,它可以捕捉到异常,那你就可以根据异常来决定返回那个数据源

observable.onErrorReturn(new Function<Throwable, Integer>() {
            @Override
            public Integer apply(Throwable throwable) throws Throwable {
                System.out.println(throwable.getMessage());
                return -1;
            }
        }).subscribe(num -> System.out.println(num+"*"));

结果:

0*
1*
异常测试
-1*

这里的observable跟上面一样,只是换了个catch操作符的操作。

onErrorResumeWith

这个操作符,当异常的时候,切换发射第二个observable的数据列

observable.onErrorResumeWith(Observable.just(-1,-2,-3)).subscribe(num -> System.out.println(num+"*"));

结果:

0*
1*
-1*
-2*
-3*

一样是上面的observable,遇到2的时候异常,然后就发射第二个设置的observable了

onErrorResumeNext

这个就不写代码了,它其实跟上面的onErrorResumeWith一样遇到异常发射第二个observable,不过它跟onErrorReturn一样可以拿到异常,那就可以根据异常决定设置哪个observable

 

Retry

当observable遇到异常时,就行重新订阅

retry

// 不加参数就是无限地retry
        observable.retry(2).subscribe(num -> System.out.println(num+"*")
                , throwable -> System.out.println("异常测试"));

结果:

0*
1*
0*
1*
0*
1*
异常测试

observable还是上面catch操作符里面的例子那个。retry里面填了参数2,表明会重新订阅两次,还是异常就输出异常。如果不填参数,就会不断retry,直到不异常为止

retryUntil

简单一句就是有条件的retry

observable.retryUntil(new BooleanSupplier() {
            @Override
            public boolean getAsBoolean() throws Throwable {
                // true就表示不retry了,进入异常
                // false就表示继续retry
                return true;
            }
        }).subscribe(num -> System.out.println(num+"*")
                , throwable -> System.out.println("异常测试"));

结果:

0*
1*
异常测试

如代码所示,当函数里面返回true就不retry了,false就继续retry

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值