异常处理

在Rxjava订阅的Observable有时会抛出异常,在RxJava中有两大类策略,一个是准备备用的Observable,在发生异常时将subscriber订阅到新的Observable上,第二种是重试。

catch

第一种策略是捕获异常并使用新的Observable来替换出现异常的Observable

方法有

onErrorReturn:返回单个对象

onErrorResumeNext:当抛出Throwable时返回一个新的Observable

onExceptionResumeNext:同onErrorResumeNext但只有抛出Exception时才会触发

@Test
public void onException() {
Observable<Object> obs = Observable
.create(sub -> {
for (int i = 0; i < 10; i++) {
if (i == 1) {
//抛出异常
sub.onError(new RuntimeException("error"));
}
sub.onNext(i);
}
});
obs.onExceptionResumeNext(Observable.just("new resumed observable"))
.subscribe(obj -> System.out.println(obj));
}
-------输出---------
0
new resumed observable

从输出中看出当遇到异常后会调用注册的备用Observable

Retry

该策略当遇到exception时会进行重试

有两类方法

retry:可以根据重试次数和错误原因来判断是否需要重试

@Test
public void retry() {
Observable<Object> obs = Observable
.create(sub -> {
for (int i = 0; i < 10; i++) {
if (i == 1) {
sub.onError(new RuntimeException("error"));
}
sub.onNext(i);
}
});
obs.retry((time,ex)->{
if(time==2 && ex instanceof RuntimeException){
return false;
}
return true;
})
.subscribe(obj -> System.out.println(obj));
}
-------输出---------
0
0 rx.exceptions.OnErrorNotImplementedException: error

可以看到retry中判断次数和错误类型根据返回决定是否要重试

retryWhen:通过将异常组成Observable并通过返回的Observable的结果来判断是否重试

下面是官方的例子,第一次会1秒重试,第二次等待2秒,第三次等待3秒,第四次停止重试

@Test
public void retryWhen(){
Observable.create((s) -> {
s.onNext("subcribe");
s.onError(new RuntimeException("always fails"));
}).retryWhen(attempts -> {
return attempts.zipWith(Observable.range(1, 3), (n, i) -> i).flatMap(i -> {
System.out.println("delay retry by " + i + " second(s)");
return Observable.timer(i, TimeUnit.SECONDS);
});
}).toBlocking().forEach(System.out::println);
}
-------输出---------
subcribe
delay retry by 1 second(s)
subcribe
delay retry by 2 second(s)
subcribe
delay retry by 3 second(s)
subcribe

Rxjava异常处理的更多相关文章

  1. Rxjava +Retrofit 你需要掌握的几个技巧,Retrofit缓存,RxJava封装,统一对有无网络处理,异常处理, 返回结果问题

    本文出处 :Tamic 文/ http://blog.csdn.net/sk719887916/article/details/52132106 Rxjava +Rterofit 需要掌握的几个技巧 ...

  2. 【腾讯Bugly干货分享】基于RxJava的一种MVP实现

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57bfef673c1174283d60bac0 Dev Club 是一个交流移动 ...

  3. 深入浅出RxJava(三:响应式的好处)

    在第一篇中,我介绍了RxJava的基础知识.第二篇中,我向你展示了操作符的强大.但是你可能仍然没被说服.这篇里面,我讲向你展示RxJava的其他的一些好处,相信这篇足够让你去使用Rxjava. 错误处 ...

  4. RxJava(一):响应式编程与Rx

    一,响应式编程 响应式编程是一种关注于数据流(data streams)和变化传递(propagation of change)的异步编程方式. 1.1 异步编程 传统的编程方式是顺序执行的,必须在完 ...

  5. 学习RxJava+Retrofit+OkHttp+MVP的网络请求使用

    公司的大佬用的是这一套,那我这个菜鸟肯定要学习使用了. 我在网上找了很多文章,写的都很详细,比如 https://www.jianshu.com/u/5fd2523645da https://www. ...

  6. 清晰易懂的RxJava入门实践

    导入 我相信大家肯定对ReactiveX 和 RxJava 都不陌生,因为现在只要是和技术相关的网站,博客都会随处见到介绍ReactiveX和RxJava的文章. ReactiveX Reactive ...

  7. 关于.NET异常处理的思考

    年关将至,对于大部分程序员来说,马上就可以闲下来一段时间了,然而在这个闲暇的时间里,唯有争论哪门语言更好可以消磨时光,估计最近会有很多关于java与.net的博文出现,我表示要作为一个吃瓜群众,静静的 ...

  8. 基于spring注解AOP的异常处理

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...

  9. 异常处理汇总 ~ 修正果带着你的Net飞奔吧!

    经验库开源地址:https://github.com/dunitian/LoTDotNet 异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983 ...

随机推荐

  1. jQuery的DOM操作详解

    DOM(Document Object Model-文档对象模型):一种与浏览器, 平台, 语言无关的规则, 使用该接口可以轻松地访问页面中所有的标准组件DOM操作的分类 核心-DOM: DOM Co ...

  2. Tray - a SharedPreferences replacement for Android

    一个代替SharedPreferences的开源库, no Editor, no commit() no apply(),因此不存在UI卡顿现象,并且支持多线程,在一个线程中存另一个线程中取数据. h ...

  3. SQL SERVER 数据导出JSON

    执行下面的存储过程: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE[dbo].[SerializeJSON]( @ ...

  4. 【刷题记录】首师附NOIP练习20160820

    [由于老师不让发题目,So只能发考点喽!!!!噜噜噜] [题目(嘘~~~~~)]:百度云下载 [T1]:好像是DP,路径压缩+排序+分情况处理100分(噜噜噜) [T2]:正解好难的样子,DFS乱搞了 ...

  5. C++-Qt【4】-CheckBox on QListView

    引用:http://www.qtcentre.org/threads/47119-checkbox-on-QListView QListWidgetItem *item = new QListWidg ...

  6. [RxJava^Android]项目经验分享 --- 异常方法处理

    简单介绍一下背景,最近RxJava很火,我也看来学习一下,计划在项目的独立模块中使用它.使用过程中遇到很多问题,在这里记录分享一下.可能有使用不当的地方,大家多多包涵.对于RxJava的基本概念和功能 ...

  7. css3 filter的十种特效

    filter默认值是none,他不具备继承性,其中filter-function具有一下属性: grayscale灰度 sepia褐色(求专业指点翻译) saturate饱和度 hue-rotate色 ...

  8. oracle统计用户下面所有的表,并显示每个表的行数

    declare  t_count   number(10);  t_str VARCHAR2(500);  cursor t_tables is select table_name from user ...

  9. 疯狂C#~伴随着我的库存管理¥

    每次的等待都是期待下一次的勃发!但激进的我非常想和大家学习一些东西,所以特地的分享了一个库存管理, 生活中容易运用的很多,但现在的学业希望能够得到各界人士的帮助!!! 首先:会有几个类来让它们协调 ( ...

  10. php函数类型

    静态变量: <?php function calcute(){ static $num =10; $num = $num+2; echo $num."<br>"; ...