针对“谈谈RxJava2中的异常及处理方法”的问题,我可以提供以下完整攻略。
异常类型
在RxJava2中,一般有以下三种异常类型:
- Checked异常:如
IOException
,必须使用try/catch
块进行处理。 - RuntimeException:如
NullPointerException
,需要程序员的代码改进避免出现此类异常。此类异常也可以被try/catch
捕获。 - 命名错误异常:如
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技术站