美文网首页RxJava爱框架
讨论下 RxJava 里的 onError

讨论下 RxJava 里的 onError

作者: 谢三弟 | 来源:发表于2016-06-01 16:34 被阅读2056次

因为上次在网络请求里用到了 onErrorReturn 所以想自己实践下和搞清楚 RxJava 里异常处理到底是怎么回事,以及自己如何更好的使用。

栗子

public class RxJavaTest {
    static int[] arrayA = new int[2];
    static List<Integer> listB = new ArrayList<>();

    public static void main(String[] args) {
        listB.add(1);
        listB.add(2);
        listB.add(3);
        errorTest();
    }

    private static void errorTest() {
        Observable.from(listB)
            .doOnNext(integer -> arrayA[integer] = integer)
            .subscribe(integer -> {
            }, throwable -> {
                System.out.println("在onError处理了:" + throwable.toString());
            });
    }
}

可以看到我在这里模拟了一个越界异常,在 errorTest() 方法里做写了遍历列表 listB 并且将值赋值给数组 arrayA 对应角标。

运行以上程序在控制台输出的是:

在onError处理了:java.lang.ArrayIndexOutOfBoundsException: 2

现在我们做一点改变:

**在 errorTest 方法里加入 onErrorReturn 并且返回 null **

    private static void errorTest() {
        Observable.from(listB)
            .doOnNext(integer -> arrayA[integer] = integer)
            .onErrorReturn(throwable -> {
                System.out.println("在onErrorReturn处理了:" + throwable.toString());
                return null;
            })
            .subscribe(integer -> {

            }, throwable -> {
                System.out.println("在onError处理了:" + throwable.toString());
            });
    }

现在再运行程序得到在控制台的输出是:

在onErrorReturn处理了:java.lang.ArrayIndexOutOfBoundsException: 2

发现异常只在 onErrorReturn 处理了,并没有在 onError 里。

难道只要写了 onErrorReturn 处理了异常就不会抛到 onError 里吗?

带着这个疑问,我们再修改下 errorTest() 方法:

    private static void errorTest() {
        Observable.from(listB)
            .doOnNext(integer -> arrayA[integer] = integer)
            .onErrorReturn(throwable -> {
                System.out.println("在onErrorReturn处理了:" + throwable.toString());
                return 3;
            })
            .doOnNext(integer -> arrayA[integer] = integer)
            .subscribe(integer -> {
            }, throwable -> {
                System.out.println("在onError处理了:" + throwable.toString());
            });
    }

让 onErrorReturn 处理了异常后并且返回一个 3,随后继续进行赋值操作。

现在运行程序,控制台输出:

在onErrorReturn处理了:java.lang.ArrayIndexOutOfBoundsException: 2
在onError处理了:java.lang.ArrayIndexOutOfBoundsException: 3

总结

onErrorRetrun 能够捕获在它之前发生的异常,它之后流中的操作发生的异常就它就不会管了。
经过小栗子的演示,我们现在理解了 onErrorReturn 的作用域,从而明白该什么是使用它。

参考文章:

相关文章

  • 讨论下 RxJava 里的 onError

    因为上次在网络请求里用到了 onErrorReturn 所以想自己实践下和搞清楚 RxJava 里异常处理到底是怎...

  • RxJava操作符-异常处理系

    一般情况下,RxJava产生的一切异常,都会传递至onError进行处理。但在有些情况下,我们需要在onError...

  • RxJava与RxAndroid基础入门

    RxAndroid是Rxjava的扩展,多了onCompleted() 和onError()方法 操作符 创建Ob...

  • RxJava中的错误处理

    在RxJava中我们可以很方便地处理异常,只要加上 onError 即可。 不过,如果异常发生在操作符内部,比如 ...

  • Rxjava中onComplete和onError分析

    1 上游怎么传递onComplete到下游2 上游怎么传递onError到下游3 它俩是互斥的吗4 多次调用的结果...

  • RxJava E/AndroidRuntime: FATAL E

    问题描述 最近在使用RxJava时,出现了一个错误,错误日志如下: 抛出异常的原因是我在onError方法中会指定...

  • egg 相关资源

    egg-onerror : egg 异常捕获 https://github.com/eggjs/egg-onerror

  • RxJava并发parallel的使用

    概述 本文不描述RxJava是什么,以及如何使用的,重点讨论如何使用RxJava实现并发。即: 区分线程切换和并发...

  • RxJava初探

    我们在学习RxJava之前要了解一下,为什么使用RxJava, 使用RxJava有什么好处 RxJava特性: 轻...

  • Android中的RxJava,Retrofit,MVP的使用

    RxJava,Retrofit,MVP都是近几年讨论的比较热门的话题,我们也来凑个热闹! 本文不展开讨论,分别讨论...

网友评论

本文标题:讨论下 RxJava 里的 onError

本文链接:https://www.haomeiwen.com/subject/acmhdttx.html