谈谈RxJava2中的异常及处理方法

针对“谈谈RxJava2中的异常及处理方法”的问题,我可以提供以下完整攻略。

异常类型

在RxJava2中,一般有以下三种异常类型:

  1. Checked异常:如 IOException,必须使用 try/catch 块进行处理。
  2. RuntimeException:如 NullPointerException,需要程序员的代码改进避免出现此类异常。此类异常也可以被 try/catch 捕获。
  3. 命名错误异常:如 OnErrorNotImplementedException,当你忘记添加 onError 处理器时就会抛出此类异常。

异常处理方法

onErrorReturn

onErrorReturn 可以将异常转换成一个值作为下游 onNext 的值。

Observable.just(1, 2, 3)
        .map(i -> 10 / i)
        .onErrorReturn(e -> -1)
        .subscribe(System.out::println);

在上述代码中,如果发生异常,就会将 onErrorReturn 中的参数 -1 作为下游的 onNext 的值,输出为 -1

onErrorResumeNext

onErrorResumeNext 可以在遇到异常时切换到一个备用的 Observable,由备用 Observable 发出元素。

Observable.just(1, 2, 3)
        .map(i -> 10 / i)
        .onErrorResumeNext(Observable.just(-1).repeat(2))
        .subscribe(System.out::println);

在上述代码中,如果发生异常,就会切换到备用的 Observable,该 Observable 发出的元素是 -1,由于这里设置了 repeat(2),则 -1 会连续再次发射两次,输出为 -1 -1 -1

retry

retry 可以让 Observable 出现错误时进行重试。

Observable.just(1, 2, 3)
        .map(i -> 10 / (3 - i))
        .retry(2)
        .subscribe(System.out::println, Throwable::printStackTrace);

在上述代码中,当发生异常时,retry(2) 表示进行两次重试,如果都失败了,就传递异常给订阅者的 onError() 处理器。输出为:

3
5
java.lang.ArithmeticException: / by zero
    at RxJava2.main(RxJava2.java:10)

RxJavaPlugins

RxJavaPlugins.setErrorHandler() 可以为所有的 Observable 配置一个公共的异常处理器,这个异常处理器适用于所有的 Observable。

RxJavaPlugins.setErrorHandler(e -> System.out.println("发生了异常:" + e.getMessage()));

示例说明

以下是两条使用示例说明:

示例1

import io.reactivex.Observable;
import io.reactivex.plugins.RxJavaPlugins;

public class RxJava2 {

    public static void main(String[] args) {
        RxJavaPlugins.setErrorHandler(e -> System.out.println("发生了异常:" + e.getMessage()));

        Observable.just(1, 2, 3)
                .map(i -> 10 / (3 - i))
                .retry(2)
                .subscribe(System.out::println, Throwable::printStackTrace);
    }
}

上述代码运行结果如下,可以看到只有第 1 次重试成功,第 2 次重试失败,最终还是抛出了异常,异常被 RxJavaPlugins 设置的处理器捕获。

3
发生了异常:/ by zero

示例2

import io.reactivex.Observable;
import io.reactivex.plugins.RxJavaPlugins;

public class RxJava2 {

    public static void main(String[] args) {
        Observable.just(1, 2, 3)
                .map(i -> 10 / i)
                .onErrorReturn(e -> -1)
                .subscribe(System.out::println);

        RxJavaPlugins.setErrorHandler(e -> System.out.println("发生了异常:" + e.getMessage()));

        Observable.just(1, 2, 3)
                .map(i -> 10 / (3 - i))
                .retry(2)
                .subscribe(System.out::println, Throwable::printStackTrace);
    }
}

上述代码运行结果如下,可以看到第一个 Observable 没有出现异常,采用了 onErrorReturn() 进行异常处理,将异常转换成了 -1 进行下一步的操作。而第二个 Observable 出现了异常,采用了 retry() 进行重试,最终还是抛出了异常被 RxJavaPlugins 设置的处理器捕获。

10
5
3.3333333333333335
3
5
发生了异常:/ by zero

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:谈谈RxJava2中的异常及处理方法 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 你必须知道的C语言预处理的问题详解

    为了让大家更好地理解C语言预处理的问题,我将分为以下几个方面进行详细讲解。 一、C语言预处理的概念 预处理是C语言编译的第一个阶段,主要作用是在编译程序执行之前进行一些预处理操作。预处理器将代码中所有以#开始的行都看作是预处理命令,包括文件包含、宏定义、条件编译等。预处理器的输出结果是一个完整的源代码文件,这个文件被用来编译生成目标文件。 二、C语言预处理命…

    C 2023年5月23日
    00
  • c语言颜色代码详解

    C语言颜色代码详解 什么是C语言颜色代码 C语言颜色代码指的是在使用C语言开发环境时,代码具有不同颜色的代码块。这种颜色代码通常由开发环境或者编辑器自带,但也可以通过修改配置文件来自定义。 C语言颜色代码的分类 C语言颜色代码通常分为以下几类: 关键字 C语言颜色代码中,关键字通常会使用蓝色或者紫色标注,以示区别。C语言中的关键字包括if, else, wh…

    C 2023年5月24日
    00
  • jQuery访问json文件中数据的方法示例

    关于“jQuery访问json文件中数据的方法示例”的完整攻略,我提供如下说明。 标题 1. 创建json文件 首先要创建一个json文件,可以使用任何文本编辑器,比如sublime、notepad++等等。文件后缀名为.json 2. 读取json文件 读取json文件需要ajax方法。使用jQuery中的 $.getJSON() 方法,可用参数type、…

    C 2023年5月23日
    00
  • python计算方程式根的方法

    下面我来详细讲解 Python 计算方程式根的方法。 什么是方程式根? 方程式是用数学符号表示的等式,例如:$x+3=5$,这个方程式的解是 $x=2$ ,而这个解就是方程式的根。在计算机编程中,我们通常需要对方程式进行求解,得到它的根。 解方程的方法 1. 数值逼近法 数值逼近法是一种广泛应用于计算机编程的求解方程式的方法。这种方法通过构造一个逐渐逼近方程…

    C 2023年5月22日
    00
  • vue实现导入json解析成动态el-table树表格

    首先,我们需要导入所需的依赖。可以使用npm或者yarn命令安装相关依赖: npm install vue vue-router axios element-ui –save-dev 其中,vue是Vue.js框架核心库,vue-router用于路由管理,axios用于发起网络请求,element-ui用于构建UI组件。 接着,我们需要在Vue.js应用中…

    C 2023年5月23日
    00
  • C++多线程编程详解

    我会详细讲解C++多线程编程的攻略。对于多线程编程,一般分为以下几个步骤: 1. 包含头文件 要进行多线程编程,需要包含头文件<thread>。 #include <thread> 2. 创建线程 使用std::thread类创建一个线程,并将需要执行的函数作为参数传入。 void my_func() { // 线程要执行的代码 } …

    C 2023年5月22日
    00
  • C++实现教师管理系统

    C++实现教师管理系统攻略 1、设计系统结构 在实现教师管理系统前,我们需要先设计系统的结构。 在本系统中,我们需要完成以下功能: 添加教师信息 删除教师信息 修改教师信息 查询教师信息 显示所有教师信息 综上所述,我们可以设计出如下的系统结构: struct Teacher { int id; //教师编号 string name; //教师姓名 int …

    C 2023年5月23日
    00
  • 浅析Objective-C的程序结构及面向对象的编程方式

    浅析Objective-C的程序结构及面向对象的编程方式 本文主要介绍Objective-C的程序结构及面向对象的编程方式。 程序结构 Objective-C的程序结构如下: #import <Foundation/Foundation.h> int main () { NSAutoreleasePool * pool = [[NSAutorel…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部