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. nvm-windows安装

    linux上的nvm太好用了,windows也出了,不过需要手动下载安装 地址: https://github.com/coreybutler/nvm-windows/releases 博主安装的是 ...

  2. pymongo

    import pymongofrom bson import ObjectIdimport jsonmongo_client=pymongo.MongoClient(host='127.0.0.1', ...

  3. if 判断语句

    if 条件:if语句块当条件成立的时候会执行if语句块, 如果条件不成立. 不执行语句块的内容 例: money = int(input("请输入你兜里的钱:")) # 300 i ...

  4. C# WPF DevExpress 图表控件之柱状图

    说明:DevExpress版本是17.1.VS是2015. XAML: <!--#region 图表控件--> <dxc:ChartControl x:Name="char ...

  5. 人工智能时代,是时候学点Python了!

    “是时候学点Python了”.作为一名不怎么安分的程序员,你或许觉得,产生这样的想法并不奇怪,但学习Python却是出于自己对工作现状以及如何应对未来挑战所作出的思考.读过我以前博客的朋友,可能都知道 ...

  6. Spring和SpringBoot比较,解惑区别

    1.概述: 对于Spring和SpringBoot到底有什么区别,我听到了很多答案,刚开始迈入学习SpringBoot的我当时也是一头雾水,随着经验的积累.我慢慢理解了这两个框架到底有什么区别,我相信 ...

  7. File Input Features

    文件输入功能 1.该插件将将一个简单的 HTML 文件输入转换为高级文件选取器控件.将有助于对不支持 JQuery 或 Javascript 的浏览器的正常 HTML 文件输入进行回退. 2.文件输入 ...

  8. Oracle 日志归档 自动清理

    exp emis/emis@orcl file=d:\backup\oracle\oracle%date:~0,10%.dmp owner=emis log=d:\backup\oracle\orac ...

  9. C# Microsoft.Office.Interop.Excel.ApplicationClass 加载类型库/DLL 时出错

    问题  无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Intero ...

  10. 读O目标KR关键结果的一些个人理解

    O目标KR关键结果 为了完成一个目标,需要完成几个或者多个关键的结果来验证. 书的开头写的是一些理论,有印象的东西还是从汉娜和杰克的公司来说,卖茶叶的公司.联系着茶农和可以产生消费的餐馆和供应商,在未 ...