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

yizhihongxing

针对“谈谈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日

相关文章

  • Android Studio中通过CMake使用NDK并编译自定义库和添加预编译库

    下面是详细讲解: 1. 简介 NDK是Android开发中的一种工具,可以让开发者利用C/C++等语言来开发JNI(Java Native Interface)的代码,从而实现更高效的底层计算。 NDK本身是一个工具链,包括编译器(gcc/clang)和标准库等。在Android Studio中进行NDK开发,一般需要借助CMake和Gradle等工具进行项…

    C 2023年5月23日
    00
  • C语言传递简单字符串

    C语言传递简单字符串 在C语言中,传递简单字符串有两种方式:指针和字符数组。以下分别介绍这两种方式的使用方法。 使用指针传递简单字符串 在C语言中,传递字符串的方式通常是通过使用指针。 指针是一种引用类型,它存储了内存地址的值。C语言中字符串实际上是由一系列字符组成的字符数组,它们在内存中是连续存储的。一个指针可以指向字符数组的第一个元素,也就是字符串的首地…

    C 2023年5月9日
    00
  • python中常用的各种数据库操作模块和连接实例

    连接数据库是Python中非常重要的操作之一。Python中有很多数据库操作模块,比如官方的sqlite3模块,以及第三方的MySQLdb和pymongo等模块。下面就对这些模块及其使用做一个详细的介绍和示例说明。 sqlite3模块 官方sqlite3模块是Python内置的模块,它可以通过Python与SQLite数据库进行交互。它允许我们执行SQL语句…

    C 2023年5月23日
    00
  • C语言实现简易版三子棋游戏

    C语言实现简易版三子棋游戏攻略 准备工作 在进行代码编写前,需要掌握以下知识: 基本的C语言语法 数组的使用和遍历 循环和条件语句的使用 头文件的引用 实现步骤 第一步:创建游戏地图 我们需要创建一个棋盘,即一个三行三列的矩阵,用来存储游戏进程和结果。因此我们需要在游戏源代码文件中,使用数组来创建这个棋盘,并对游戏盘进行初始化。示例代码如下: char bo…

    C 2023年5月23日
    00
  • 如何利用C++实现mysql数据库的连接池详解

    如何利用C++实现mysql数据库的连接池详解 什么是数据库连接池 数据库连接池是一种用来缓存数据库连接的技术,它可以提高数据库的访问效率,避免重复连接数据库导致的资源浪费和性能下降。在高并发的情况下,数据库连接池会发挥更大的优势。 如何利用C++实现mysql数据库的连接池 1. 安装mysql C++ Connector mysql C++ Connec…

    C 2023年5月22日
    00
  • 基于Java中Math类的常用函数总结

    基于Java中Math类的常用函数总结 简介 Java的Math类为开发者提供了许多数学方法,使用这些方法能够方便地对数据进行处理和计算。本篇文章将对Java中Math类的一些常用函数进行总结和详细讲解,包括:绝对值函数、对数函数、三角函数等。 绝对值函数 绝对值函数在数学中也称为模函数,是一个常用的函数。在Java中,可以使用Math类中的abs函数来计算…

    C 2023年5月22日
    00
  • 浅析Java异常处理中断言的使用

    浅析Java异常处理中断言的使用 Java异常处理机制允许程序在出现错误和异常时进行优雅的处理,从而保证程序的安全性和稳定性。而其中断言(assertion)机制则是一种非常强大的调试工具,可以在程序出现错误时,中断程序并给出特定的提示,帮助程序员更快地定位和修复问题。 在本篇攻略中,我们将分为以下几个部分,详细讲解Java异常处理中断言的原理、用法及注意事…

    C 2023年5月23日
    00
  • C语言详细讲解#error与#line如何使用

    C语言详细讲解 #error与#line如何使用 简介 在C语言中,#error和#line是两个预处理器指令,可以用于编写更好的代码。#error指令用于在遇到错误时生成编译错误,而#line指令用于更改编译器输出的行号和文件名。 #error指令 error指令用于在源代码中显示一个错误消息,并且在编译时会生成一个错误。它的语法如下: #error me…

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