Error Handling Operators

Operators to Convert Observables

本文的主题为对 Observable 进行错误处理的操作符以及转换 Observable 类型的操作符。

这里的 Observable 实质上是可观察的数据流。

RxJava操作符(五)Error Handling

公共代码

  • RxNET
public static void Dump<T>(this IObservable<T> source, string name)
{
source.Subscribe(
i => Console.WriteLine("{0}-->{1}", name, i),
ex => Console.WriteLine("{0} failed-->{1}", name, ex.Message),
() => Console.WriteLine("{0} completed", name));
}
  • RxJava
fun <T> Observable<T>.dump() =
this.subscribe({ println("onNext: $it") },
{ e -> println("onError: ${e.javaClass.name}: ${e.message}") },
{ println("onComplete") })

Catch / OnErrorResumeNext

ReactiveX - Catch operator

Reactive Extensions再入門 その11「Catchメソッド」

Reactive Extensions再入門 その34「ダメなら次の人!を実現するOnErrorResumeNextメソッド」

当源数据流出错抛出异常时,Catch 能捕捉该异常并从中恢复。相当于 catch 语句。

不指定异常类型时,Catch 能捕捉所有类型的异常。

指定异常类型时,Catch 只能捕捉指定类型的异常。

OnErrorResumeNext 与 VB 的同名语句的作用相同。使用该操作符的话,一个数据流无论出错还是正常结束都会转到后一个指定数据流。



  • RxNET
var source = new Subject<int>();
var result = source.Catch(Observable.Empty<int>());
result.Dump("Catch");
source.OnNext(1);
source.OnNext(2);
source.OnError(new Exception("Fail!"));
/*
Catch-->1
Catch-->2
Catch completed
*/
var source = new Subject<int>();
var result = source.Catch<int, TimeoutException>(tx => Observable.Return(-1));
result.Dump("Catch");
source.OnNext(1);
source.OnNext(2);
source.OnError(new TimeoutException());
/*
Catch-->1
Catch-->2
Catch-->-1
Catch completed
*/
var source = new Subject<int>();
var result = source.Catch<int, TimeoutException>(tx => Observable.Return(-1));
result.Dump("Catch");
source.OnNext(1);
source.OnNext(2);
source.OnError(new ArgumentException("Fail!"));
/*
Catch-->1
Catch-->2
Catch failed-->Fail!
*/
Observable
.Throw<string>(new Exception())
.OnErrorResumeNext(Observable.Return("OK"))
.Subscribe(
s => Console.WriteLine("OnNext: {0}", s),
ex => Console.WriteLine("OnError: {0}", ex),
() => Console.WriteLine("OnCompleted"));
new[] { "NG", "Error", "Abort", "OK" }
.Select((s, i) => new { index = i, value = s })
.Select(s => s.value != "OK" ?
Observable.Throw<string>(new Exception(s.ToString())) :
Observable.Return(s.ToString()))
.OnErrorResumeNext()
.Subscribe(
s => Console.WriteLine("OnNext: {0}", s),
ex => Console.WriteLine("OnError: {0}", ex),
() => Console.WriteLine("OnCompleted"));
new[] { "NG", "OK", "Abort", "Error" }
.Select((s, i) => new { index = i, value = s })
.Select(s => s.value != "OK" ?
Observable.Throw<string>(new Exception(s.ToString())) :
Observable.Return(s.ToString()))
.OnErrorResumeNext()
.Subscribe(
s => Console.WriteLine("OnNext: {0}", s),
ex => Console.WriteLine("OnError: {0}", ex),
() => Console.WriteLine("OnCompleted"));
new[] { "NG", "Exception", "Abort", "Error" }
.Select((s, i) => new { index = i, value = s })
.Select(s => s.value != "OK" ?
Observable.Throw<string>(new Exception(s.ToString())) :
Observable.Return(s.ToString()))
.OnErrorResumeNext()
.Subscribe(
s => Console.WriteLine("OnNext: {0}", s),
ex => Console.WriteLine("OnError: {0}", ex),
() => Console.WriteLine("OnCompleted"));
/*
OnNext: OK
OnCompleted
OnNext: { index = 3, value = OK }
OnCompleted
OnNext: { index = 1, value = OK }
OnCompleted
OnCompleted
*/
  • RxJava





val values = Observable.create<String> { o ->
o.onNext("Rx")
o.onNext("is")
o.onError(Exception("adjective unknown"))
}
values
.onErrorReturn { e -> "Error: " + e.message }
.dump()
/*
onNext: Rx
onNext: is
onNext: Error: adjective unknown
onComplete
*/
val values = Observable.create<Int> { o ->
o.onNext(1)
o.onNext(2)
o.onError(Exception("Oops"))
}
values
.onErrorResumeNext(Observable.just(Integer.MAX_VALUE))
.dump()
/*
onNext: 1
onNext: 2
onNext: 2147483647
onComplete
*/
val values = Observable.create<Int> { o ->
o.onNext(1)
o.onNext(2)
o.onError(Exception("Oops"))
}
values
.onErrorResumeNext( Function { e -> Observable.error(UnsupportedOperationException(e)) } )
.dump()
/*
onNext: 1
onNext: 2
onError: java.lang.UnsupportedOperationException: java.lang.Exception: Oops: java.lang.Exception: Oops
*/
val values = Observable.create<String> { o ->
o.onNext("Rx")
o.onNext("is")
// o.onError(Throwable()) // this won't be caught
o.onError(Exception()) // this will be caught
}
values
.onExceptionResumeNext(Observable.just("hard"))
.dump()
/*
onNext: Rx
onNext: is
onNext: hard
onComplete
*/
val values = Observable.create<String> { o ->
o.onNext("Rx")
o.onNext("is")
o.onError(object : Throwable() {
}) // this won't be caught
}
values
.onExceptionResumeNext(Observable.just("hard"))
.dump()
/*
onNext: Rx
onNext: is
onNext: hard
onComplete
*/
  • RxSwift
let disposeBag = DisposeBag()
let sequenceThatFails = PublishSubject<String>()
sequenceThatFails
.catchErrorJustReturn("

ReactiveX 学习笔记(8)错误处理和 To 操作符的更多相关文章

  1. NLTK学习笔记(一):语言处理和Python

    目录 [TOC] nltk资料下载 import nltk nltk.download() 其中,download() 参数默认是all,可以在脚本里面加上nltk.download(需要的资料库) ...

  2. ReactiveX 学习笔记(9)工具类操作符

    Observable Utility Operators 本文的主题为处理 Observable 的实用工具类操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操作符(六) ...

  3. ReactiveX 学习笔记(0)学习资源

    ReactiveX 学习笔记 ReactiveX 学习笔记(1) ReactiveX 学习笔记(2)创建数据流 ReactiveX 学习笔记(3)转换数据流 ReactiveX 学习笔记(4)过滤数据 ...

  4. python学习笔记014——错误和异常

    Python有两种错误很容易辨认:语法错误和异常. 1 什么是语法错误 Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例 if i>4 print("if语句输出 ...

  5. HBase学习笔记之HBase原理和Shell使用

    HBase学习指南之HBase原理和Shell使用 参考资料: 1.https://www.cnblogs.com/nexiyi/p/hbase_shell.html,hbase shell

  6. php自定义错误处理和try{}catch(){}学习

    <?php //语法错误 //运行时的错误 //逻辑错误 //php的错误报告级别 // display_errors; // ini_set("display_errors" ...

  7. Python学习笔记七-错误和异常

    程序员总是和各种错误打交道,学习如何识别并正确的处理程序错误是很有必要的. 7.1错误和异常 1.错误 从软件方面来看,错误分为语法错误和逻辑错误两种.这两种错误都将导致程序无法正常进行下去,当Pyt ...

  8. Spring.Net学习笔记(0)-错误汇总

    1.错误一:ObjectDefinitionStoreException "Spring.Objects.Factory.ObjectDefinitionStoreException&quo ...

  9. swift学习笔记之-错误处理

    //错误处理 import UIKit /*错误处理(Error Handling):响应错误以及从错误中恢复的过程 在 Swift 中,错误用符合ErrorType协议的类型的值来表示.这个空协议表 ...

随机推荐

  1. RabbitMQ入门教程(十):队列声明queueDeclare(转载)

    原文转载至:https://blog.csdn.net/vbirdbest/article/details/78670550 简介本节主要讨论队列声明的各个参数 queueDeclare(String ...

  2. vue todolist 1.0

    <template> <div id="app"> <input type="text" v-model='todo' /> ...

  3. MongoDB集群搭建之主从模式

    单机搭建 #创建docker持久化数据目录 [root@docker ~]# mkdir -p /root/application/program/mongodb/data/master-slaveM ...

  4. [深度分析] Python Web 开发框架 Bottle

    [深度分析] Python Web 开发框架 Bottle(这个真的他妈的经典!!!) 作者:lhf2009913 Bottle 是一个非常精致的WSGI框架,它提供了 Python Web开发中需要 ...

  5. lua 安装

    1:下载安装 curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz tar zxf lua-5.3.0.tar.gz cd lua-5.3.0 make ...

  6. MapReduce Demo

    功能:统计公司员工一个月内手机上网上行流量.下行流量及总流量. 测试数据如下: 13612345678     6000    1000 13612345678     2000    3000 13 ...

  7. MapReduce的工作机制

    <Hadoop权威指南>中的MapReduce工作机制和Shuffle: 框架 Hadoop2.x引入了一种新的执行机制MapRedcue 2.这种新的机制建议在Yarn的系统上,目前用于 ...

  8. Java - 33 Java Applet基础

    Java Applet基础 applet是一种Java程序.它一般运行在支持Java的Web浏览器内.因为它有完整的Java API支持,所以applet是一个全功能的Java应用程序. 如下所示是独 ...

  9. 《Linux 性能及调优指南》3.2 CPU瓶颈

    翻译:飞哥 ( http://hi.baidu.com/imlidapeng ) 版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明. 原文名称:<Linux Performance ...

  10. fatal error C1083: Cannot open include file: 'openssl/opensslv.h'

    在安装针对ELK系统的警告工具elastalert时,报错: fatal error C1083: Cannot open include file: 'openssl/opensslv.h',如下图 ...