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. [UE4]国际化,中英文切换

    只有“Text”数据类型才支持国际化 必须以独立游戏窗口运行,语音切换才会起作用.

  2. C# DataReader

    //1 连接字符串 string connectionString = "server=127.0.0.1;integrated security=true;database=MSPetSh ...

  3. JS面试典型常见问题与解答

    Q1:下面代码段的输出是什么? 为什么? (Scope) (function() { var a = b = 5; })(); console.log(b); A1: 输出是5. 在上面的立即调用函数 ...

  4. CS229 6.5 Neurons Networks Implements of Sparse Autoencoder

    sparse autoencoder的一个实例练习,这个例子所要实现的内容大概如下:从给定的很多张自然图片中截取出大小为8*8的小patches图片共10000张,现在需要用sparse autoen ...

  5. linux杂项

    重装后激活root帐号并设置密码 sudo passwd root sudo: netstat:找不到命令 安装net-tools:sudo apt-get install net-tools Com ...

  6. @Autowired与@Resource 详细诠释和区别(附带例子)

    @Autowired 与@Resource:1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2.@Autowired默认按类型装配( ...

  7. 修改windows服务的描述

    sc description  xxxxxxxxxx  "需要修改成的描述" sc 是主命令 description 是这个主命令的具体command xxxxxxxxxx  是服 ...

  8. SPOJ3276 D-query

    题意:n个数 a1...an,q组询问,每组询问给定 l,r,输出 [ l, r ] 有多少不同的数 ( n ≤30000, q ≤200000, ai ≤ 106 ) 离线 + 树状数组维护 #in ...

  9. Ubuntu安装MyEclise16 过程差不多

    选择好安装路径,和workpace路径,可能会因为工作空间放的位置不太对,导致myeclipse出现问题. 1.Ubuntu安装MyEclise10 不知道为什么网上会有那么多安装过程,还有配置目录和 ...

  10. Java实现图像对比类

    package com.function; import java.awt.image.BufferedImage; import java.io.BufferedWriter; import jav ...