谈谈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日

相关文章

  • 一文详解Qt中线程的实际应用

    一、什么是Qt中的线程? Qt中的线程是指在Qt框架下使用的线程,它是建立在操作系统线程之上的一个高层抽象。Qt中的线程分为QThread线程和QtConcurrent线程两种。其中,QThread线程是比较传统的线程实现方式,而QtConcurrent则是在Qt4中新增的一种线程实现方式,相对而言更加简单。 二、为什么要使用Qt中的线程? 在许多程序中,为…

    C 2023年5月22日
    00
  • 如何在C语言中判断socket是否已经断开

    要在C语言中判断socket是否已经断开,可以通过以下方式实现: 使用heartbeat机制: 可以使用心跳机制来判断socket是否已经断开。在socket连接建立之后,不断地在两端之间发送心跳包,如果一段时间内没有收到对端的心跳回复,则认为连接已经断开。 以下是使用heartbeat机制的示例代码: #include <stdio.h> #i…

    C 2023年5月23日
    00
  • python网络编程学习笔记(九):数据库客户端 DB-API

    关于“python网络编程学习笔记(九):数据库客户端 DB-API”的完整攻略,我做如下分享。 一、DB-API是什么? DB-API全称为Database Application Programming Interface,是Python标准化的数据库编程接口,其定义了一系列必须的对象和数据库操作的方法,可以用来访问各种不同的关系数据库。 在Python…

    C 2023年5月22日
    00
  • C语言实现客房管理系统

    C语言实现客房管理系统的完整攻略包含以下几个步骤: 设计数据结构和功能模块 首先需要设计客房管理系统的数据结构和功能模块。根据系统需要,可以设计出以下数据结构: Room:客房信息,包括客房号、类型、价格、当前状态(已入住或未入住)等。 Order:订单信息,包括客房号、入住时间、退房时间、客人姓名等。 根据这些数据结构,可以设计出以下功能模块: Check…

    C 2023年5月23日
    00
  • IOS 开发之NSDictionary转换成JSON字符串

    我来为您详细讲解iOS开发中将NSDictionary转换为JSON字符串的完整攻略。 1. 转换原理 在iOS中,我们可以使用Apple官方提供的NSJSONSerialization类来实现NSDictionary转换成JSON字符串。具体来说,我们可以使用此类的dataWithJSONObject:options:error:方法将NSDictiona…

    C 2023年5月23日
    00
  • C语言 strcpy()函数

    当我们需要对一个字符串进行复制的时候,可以使用C语言中的strcpy()函数。本文将详细介绍strcpy()函数的使用方法,并包含两个示例来帮助读者更好地了解其使用。 函数说明 strcpy()函数的原型如下: char *strcpy(char *dest, const char *src); 该函数的功能是将源字符串(src)复制到目标字符串(dest)…

    C 2023年5月9日
    00
  • C 语言编写一个计算器界面(可视化界面和多功能)

    下面是详细讲解“C 语言编写一个计算器界面(可视化界面和多功能)”的完整攻略。这里我们将使用C语言以及图形库GraphWin来实现一个可视化界面的计算器程序,并实现基本的加减乘除运算以及数字输入等多种功能。 确认环境 首先要确定你已经正确安装了 C 语言编译器和图形库GraphWin(也叫作 WinBGIm),如果你还没有则需要先安装。在 Windows 操…

    C 2023年5月23日
    00
  • C++ new、delete(new[]、delete[])操作符重载需要注意的问题

    C++中的 new 和 delete 操作符是用来管理动态内存分配的。在某些情况下,我们需要对 new 和 delete 进行重载,以满足我们特定的需求。但是重载这些操作符需要特别注意一些问题。 为什么需要重载? 一些使用场景: 改变内存分配行为,比如使用某种特殊的内存池来提高内存分配性能。 跟踪某些内存分配和释放,例如在调试模式下记录分配的位置和大小,释放…

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