相关文章推荐
打盹的板栗  ·  前端传递JSON数组数据到后端(解析方法)_ ...·  3 周前    · 
冷冷的草稿本  ·  txt文件转数组_python读取txt为数组·  3 周前    · 
淡定的盒饭  ·  ASP.NET 核心 Blazor ...·  3 周前    · 
傻傻的馒头  ·  STRING_SPLIT ...·  2 周前    · 
坚韧的啤酒  ·  表达式和函数 - Azure Data ...·  2 周前    · 
傻傻的消炎药  ·  手动添加的边框会导致div闪动_div边框闪 ...·  1 年前    · 
忐忑的黑框眼镜  ·  Gitkraken免破解,放肆用 - 简书·  2 年前    · 
善良的拐杖  ·  libevent 之 event ...·  2 年前    · 
文武双全的单车  ·  wpf image 点击事件-掘金·  2 年前    · 
坐怀不乱的罐头  ·  RK3399 ARM ...·  2 年前    · 
Code  ›  RxJava之异常捕获操作符介绍开发者社区
string
https://cloud.tencent.com/developer/article/2195325
刚毅的企鹅
2 年前
作者头像
103style
0 篇文章

RxJava之异常捕获操作符介绍

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > Android开发经验分享 > RxJava之异常捕获操作符介绍

RxJava之异常捕获操作符介绍

作者头像
103style
发布 于 2022-12-19 13:28:23
315 0
发布 于 2022-12-19 13:28:23
举报

转载请以链接形式标明出处: 本文出自: 103style的博客

异常捕获相关的操作符 以及 官方介绍

RxJava 之 异常捕获操作符 官方介绍 : Error Handling Operators

  • doOnError
  • onErrorComplete
  • onErrorResumeNext
  • onErrorReturn
  • onErrorReturnItem
  • onExceptionResumeNext
  • retry
  • retryUntil
  • retryWhen

doOnError

出现错误会先走 doOnError 的回调,然后才走 onError .

官方示例:

Observable.error(new IOException("Something went wrong"))
        .doOnError(new Consumer<Throwable>() {
            @Override
            public void accept(Throwable error) throws Exception {
                System.err.println("The error message is: " + error.getMessage());
        .subscribe(new Consumer<Object>() {
            @Override
            public void accept(Object o) throws Exception {
                System.out.println("onNext should never be printed!");
        }, new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                throwable.printStackTrace();
        }, new Action() {
            @Override
            public void run() throws Exception {
                System.out.println("onComplete should never be printed!");
        });

输出:

The error message is: Something went wrong
java.io.IOException: Something went wrong
	at io.reactivex.android.samples.Test.main(Test.java:15)

onErrorComplete

io.reactivex.functions.Predicate 可以将 error 事件 修正为 complete 事件

官方示例:

Completable.fromAction(new Action() {
    @Override
    public void run() throws Exception {
        throw new IOException();
}).onErrorComplete(new Predicate<Throwable>() {
    @Override
    public boolean test(Throwable throwable) throws Exception {
        return throwable instanceof IOException;
}).subscribe(
        new Action() {
            @Override
            public void run() throws Exception {
                System.out.println("IOException was ignored");
        new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                System.err.println("onError should not be printed!");
        });

输出:

IOException was ignored

onErrorResumeNext

官方示例:

Observable<Integer> numbers = Observable.generate(new Callable<Integer>() {
    @Override
    public Integer call() throws Exception {
        return 1;
}, new BiFunction<Integer, Emitter<Integer>, Integer>() {
    @Override
    public Integer apply(Integer state, Emitter<Integer> emitter) throws Exception {
        emitter.onNext(state);
        return state + 1;
numbers.scan(new BiFunction<Integer, Integer, Integer>() {
    @TargetApi(Build.VERSION_CODES.N)
    @Override
    public Integer apply(Integer i1, Integer i2) throws Exception {
        return Math.multiplyExact(i1, i2);
}).onErrorResumeNext(new ObservableSource<Integer>() {
    @Override
    public void subscribe(Observer<? super Integer> observer) {
        Observable.empty();
}).subscribe(new Consumer<Integer>() {
    @Override
    public void accept(Integer integer) throws Exception {
        System.out.println(integer);
}, new Consumer<Throwable>() {
    @Override
    public void accept(Throwable throwable) throws Exception {
        System.err.println("onError should not be printed!");
});

输出:

1
40320
362880
3628800
39916800
479001600

onErrorReturn

当出现 error 事件的时候, 走 onErrorReturn 回调之后 直接 onComplete

官方示例:

Observable.just("1", "2", "2A", "3")
        .map(new Function<String, Integer>() {
            @Override
            public Integer apply(String s) throws Exception {
                return Integer.parseInt(s, 10);
        .onErrorReturn(new Function<Throwable, Integer>() {
            @Override
            public Integer apply(Throwable throwable) throws Exception {
                if (throwable instanceof NumberFormatException) {
                    return 0;
                } else {
                    throw new IllegalArgumentException();
        }).subscribe(
        new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                System.out.println(integer);
        }, new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                System.err.println("onError should not be printed!");
        });

输出:

1
0

onErrorReturnItem

当出现 error 事件的时候, 传递 onErrorReturnItem 的参数给 onNext 之后 直接 onComplete

官方示例:

Observable.just("1", "2", "2A", "3")
        .map(new Function<String, Integer>() {
            @Override
            public Integer apply(String s) throws Exception {
                return Integer.parseInt(s, 10);
        .onErrorReturnItem(100)
        .subscribe(
                new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        System.out.println(integer);
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        System.err.println("onError should not be printed!");
                });  

输出:

1
100

onExceptionResumeNext

官方示例:

Observable<String> exception = Observable.<String>error(new IOException())
        .onExceptionResumeNext(new ObservableSource<String>() {
            @Override
            public void subscribe(Observer<? super String> observer) {
                Observable.just("This value will be used to recover from the IOException");
Observable<String> error = Observable.<String>error(new Error())
        .onExceptionResumeNext(new ObservableSource<String>() {
            @Override
            public void subscribe(Observer<? super String> observer) {
                Observable.just("This value will not be used");
Observable.concat(exception, error)
        .subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                System.out.println("onNext: " + s);
        }, new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                System.err.println("onError: " + throwable);
        });

输出:

onNext: This value will be used to recover from the IOException
onError: java.lang.Error

retry

遇到 error 事件 根据 retry 的回调来确定是否重试。

官方示例:

Observable<Long> source = Observable.interval(0, 1, TimeUnit.SECONDS)
        .flatMap(new Function<Long, ObservableSource<Long>>() {
            @Override
            public ObservableSource<Long> apply(Long x) throws Exception {
                if (x >= 2) {
                    return Observable.error(new IOException("Something went wrong!"));
                } else {
                    return Observable.just(x);
source.retry(new BiPredicate<Integer, Throwable>() {
    @Override
    public boolean test(Integer integer, Throwable throwable) throws Exception {
        return integer < 3;
}).blockingSubscribe(new Consumer<Long>() {
    @Override
    public void accept(Long x) throws Exception {
        System.out.println("onNext: " + x);
}, new Consumer<Throwable>() {
    @Override
    public void accept(Throwable throwable) throws Exception {
        System.out.println(throwable.getMessage());
});

输出:

onNext: 1
onNext: 0
onNext: 1
onNext: 0
onNext: 1
Something went wrong!

retryUntil

遇到 error 事件 根据 retryUntil 的回调来确定是否重试。

官方示例:

final LongAdder errorCounter = new LongAdder();
Observable<Long> source = Observable.interval(0, 1, TimeUnit.SECONDS)
        .flatMap(new Function<Long, ObservableSource<Long>>() {
            @Override
            public ObservableSource<Long> apply(Long x) throws Exception {
                if (x >= 2) {
                    return Observable.error(new IOException("Something went wrong!"));
                } else {
                    return Observable.just(x);
        }).doOnError(new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                errorCounter.increment();
source.retryUntil(new BooleanSupplier() {
    @Override
    public boolean getAsBoolean() throws Exception {
        return errorCounter.intValue() >= 3;
}).blockingSubscribe(new Consumer<Long>() {
    @Override
    public void accept(Long x) throws Exception {
        System.out.println("onNext: " + x);
}, new Consumer<Throwable>() {
    @Override
    public void accept(Throwable throwable) throws Exception {
        System.out.println(throwable.getMessage());
});

输出:

onNext: 0
onNext: 1
onNext: 0
onNext: 1
onNext: 0
onNext: 1
Something went wrong!

retryWhen

遇到 error 事件 根据 retryWhen 的回调来确定是否重试。

官方示例:

Observable<Long> source = Observable.interval(0, 1, TimeUnit.SECONDS)
        .flatMap(new Function<Long, ObservableSource<Long>>() {
            @Override
            public ObservableSource<Long> apply(Long x) throws Exception {
                if (x >= 2) {
                    return Observable.error(new IOException("Something went wrong!"));
                } else {
                    return Observable.just(x);
source.retryWhen(new Function<Observable<Throwable>, ObservableSource<?>>() {
    @Override
    public ObservableSource<?> apply(Observable<Throwable> throwableObservable) throws Exception {
        return throwableObservable.map(new Function<Throwable, Integer>() {
            @Override
            public Integer apply(Throwable throwable) throws Exception {
                return 1;
        }).scan(new BiFunction<Integer, Integer, Integer>() {
            @Override
            public Integer apply(Integer integer, Integer integer2) throws Exception {
                return integer + integer2;
        }).doOnNext(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                System.out.println("No. of errors: " + integer);
        }).takeWhile(new Predicate<Integer>() {
            @Override
            public boolean test(Integer integer) throws Exception {
                return integer < 3;
        }).flatMapSingle(new Function<Integer, SingleSource<?>>() {
            @Override
            public SingleSource<?> apply(Integer integer) throws Exception {
                return Single.timer(integer, TimeUnit.SECONDS);
}).blockingSubscribe(new Consumer<Long>() {
    @Override
    public void accept(Long x) throws Exception {
        System.out.println("onNext: " + x);
}, new Consumer<Throwable>() {
    @Override
    public void accept(Throwable throwable) throws Exception {
        throwable.printStackTrace();
}, new Action() {
    @Override
    public void run() throws Exception {
        System.out.println("onComplete");
});

输出:

onNext: 0
onNext: 1
No. of errors: 1
onNext: 0
 
推荐文章
打盹的板栗  ·  前端传递JSON数组数据到后端(解析方法)_element-china-area-data 前端json数组怎么转换成字符串传到后端
3 周前
冷冷的草稿本  ·  txt文件转数组_python读取txt为数组
3 周前
淡定的盒饭  ·  ASP.NET 核心 Blazor 渲染性能最佳做法 | Microsoft Learn
3 周前
傻傻的馒头  ·  STRING_SPLIT (Transact-SQL) - SQL Server | Microsoft Learn
2 周前
坚韧的啤酒  ·  表达式和函数 - Azure Data Factory & Azure Synapse | Microsoft Learn
2 周前
傻傻的消炎药  ·  手动添加的边框会导致div闪动_div边框闪烁-CSDN博客
1 年前
忐忑的黑框眼镜  ·  Gitkraken免破解,放肆用 - 简书
2 年前
善良的拐杖  ·  libevent 之 event config的相关函数介绍_event_config_new_yldfree的博客-CSDN博客
2 年前
文武双全的单车  ·  wpf image 点击事件-掘金
2 年前
坐怀不乱的罐头  ·  RK3399 ARM QT开发环境搭建_rk3399 qt交叉编译环境搭建_风的呼吸7的博客-CSDN博客
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号