谈谈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语言中向链接列表添加节点的完整使用攻略。 什么是链接列表 链接列表(Linked List)是由多个节点组成的数据结构,每个节点包含一个数据元素和指向下一个节点的指针。 链接列表的优点是可以高效地插入和删除节点,而且不需要预先知道列表的大小。但缺点是访问任意一个节点的时间复杂度为O(n),不如数组高效。 如何向链接列表添加节点 首先,我们需要定义节…

    C 2023年5月9日
    00
  • C++中的函数知识点大全

    C++中的函数知识点大全 C++作为一门强大的编程语言,函数是它最基本的组成部分之一,函数的使用和编写对于学习C++语言来说是至关重要的。本文将介绍C++函数的多种用法和注意事项。 函数的定义 函数是对一系列操作的封装,它可以完成一个特定的功能,可以在程序中被调用。一个函数的定义有以下形式: 返回类型 函数名(参数列表){ // 函数体 } 其中,返回类型指…

    C 2023年5月22日
    00
  • VC获取当前路径及程序名的实现代码

    获取当前路径及程序名是在VC编程中常见的需求,本文将为大家讲解如何通过C++代码来实现。下面是完整的攻略: 步骤一:包含头文件 在代码中需要包含以下两个头文件: #include <iostream> #include <windows.h> 第一个头文件是C++标准库中的头文件,用于输入和输出流;第二个头文件是Windows API…

    C 2023年5月30日
    00
  • QT5连接MySQL实现增删改查

    下面就是QT5连接MySQL实现增删改查的完整攻略。 1. 安装MySQL驱动 在QT5中连接MySQL必须要安装MySQL驱动,你可以从以下链接中下载:https://www.mysql.com/products/connector/ 将下载好的驱动放在QT5安装目录下的plugins/sqldrivers目录下。 2. 配置项目文件 在.pro文件中添加…

    C 2023年5月23日
    00
  • c语言swap(a,b)值交换的4种实现方法

    下面是关于“c语言swap(a,b)值交换的4种实现方法”的完整攻略: 1.方法一:使用中间变量 这是最常见的一种方法,使用一个中间变量来存储一个变量的值,然后再将该变量的值赋给另一个变量。具体实现可以参考下面的代码: void swap(int *a, int *b) { int temp = *a; // 存储a的值 *a = *b; // 将b的值赋给…

    C 2023年5月23日
    00
  • json对象转字符串如何实现

    首先,需要明确一下,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于Web应用程序之间的数据交换。JSON对象是一种由“键/值”对组成的数据结构,可以通过一些库函数将其转化为字符串形式。 下面是JSON对象转字符串的方法: 1.使用JSON.stringify()方法 JSON.stringify()是将…

    C 2023年5月23日
    00
  • C++算法之海量数据处理方法的总结分析

    C++算法之海量数据处理方法的总结分析 1.前言 在现在这个大数据时代,我们经常需要处理海量数据。在日常编程工作中,会遇到需要处理海量数据的情况。如何高效地处理海量数据一直是程序员所关注的一个难点。下面我将总结几种海量数据处理方法并进行分析。 2.海量数据分割法 问题 海量数据的处理会导致内存溢出,因此,需要对海量数据进行分割,分割后每个部分逐一处理。 示例…

    C 2023年5月22日
    00
  • C 标准库 stdlib.h

    首先,stdlib.h 是C语言标准库中的一个头文件,提供了一组函数来执行与内存分配、进程控制、字符串转换、类型转换等有关的一般实用程序。下面是几个常用的函数: 1. malloc() 在堆上分配指定字节大小的内存。返回指向分配内存的指针。如果分配失败,返回NULL。 函数原型: void *malloc(size_t size); 示例: #include…

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