RxJava 学习笔记<十一> 译 Advanced error handling

Advanced error handling


我们已经看到了如何处理观察者中的错误,然而,到那时,我们实际上已经超出了 Monad 的范围。错误可能有很多种,并不是每一个错误都值得一路推到顶端。在标准Java中,您可以在任何级别捕获异常,并决定是在那里处理还是进一步抛出。类似地,在Rx中,您可以基于错误定义行为,而不必终止可观察到的行为,并强制观察者处理所有的问题。

Resume

onErrorReturn

在下一个示例中,我们将把错误转换为要打印的正常值:

输出:

onErrorResumeNext

onErrorResumeNext 允许您用另一个序列恢复失败的序列。该错误不会出现在所得到的可观察到的结果中。

第一个重载在每种情况下都使用相同的可观察到的后续操作。第二个重载允许您根据发生的错误决定顺序。

输出:

扫描二维码关注公众号,回复: 181616 查看本文章

没有什么能停止 resumeSequence 的失败。事实上,如果您想更改错误的类型,您可以立即返回一个可观察到的错误。在标准Java中,组件可能会决定它们不能处理错误,而应该重新抛出错误。在这种情况下,通常会在原始错误周围包装一个新的异常,从而提供额外的上下文。在Rx中也可以这样做。

现在序列仍然失败,但是您已经将原来的错误封装在一个新的错误中。

onExceptionResumeNext

onExceptionResumeNext与onErrorResumeNext只有一个区别:它只捕获作为异常的错误

输出:

Retry

如果错误是不确定的,那么重试可能是有意义的。重试重新订阅源并再次从星号发出所有信息。

如果错误没有消失,retry()将把我们锁定在无限重试的循环中。第二个重载限制重试的次数。如果错误持续存在且序列失败n次,则重试(N)也将失败。让我们看一个例子:

这边有个输出是 rx.exceptions.OnErrorNotImplementedException,理解不了 ???

在这里,我们已经指定要重试一次。我们的可观测值在两个值后失败,然后再试一次,再失败一次。第二次失败时,允许异常通过。

在这个例子中,我们做了一些棘手的事情:我们将订阅状态设置为有状态,以证明可观察到的是从源重新启动的:它第二次产生了不同的值。retry不缓存任何元素,比如重播,这样做也没有意义。只有在有副作用或可观察到的是热的情况下,重试才有意义。

retryWhen

一旦发生故障,retry 将重新启动订阅。如果我们需要更多的控制,我们可以使用retryWhen

retryWhen的参数是一个接受可观察值并返回另一个值的函数。可观察到的输入会发出当遇到时再次出现的所有错误。当重试时可观察到的信号:

  • 如果发出一个值,将重试
  • 如果它以错误终止,不重试

  • 如果成功终止,则重试也成功终止。

请注意,可观察到的信号类型和发出的实际值并不重要。这些值被丢弃,可观测值仅用于计时。

在下一个示例中,我们将构造一个重试策略,在重试之前等待100 ms。

输出:

我们的源可观察到发出2个值,并立即失败。当发生这种情况时,内部可观察到的故障将在发出错误时重试。我们延迟发射100毫秒,并将其发送回信号重试。 take(2)保证我们的信号可观测到的将终止后,我们收到两个错误。

using

using 操作符用于从需要管理的资源中创建observables。它保证无论何时以何种方式终止订阅,都将管理您的资源。如果只使用create,就必须在传统Java范例中进行管理,并将其注入Rx中。在Rx中,using 是一种更自然的管理资源的方式。

当新的订阅开始时,ResourceFactory 将租用必要的资源。当不再需要资源时,将使用disposeAction对其进行处置。无论订阅以何种方式终止(成功或失败),都将执行Disposal操作。

在下一个示例中,我们假设字符串是需要管理的资源。

输出:

当我们订阅值时,将调用资源工厂函数,该函数返回“MyResource”。该字符串用于生成一个可观察的字符串,它会发出字符串中的所有字符。一旦订阅结束,资源将被释放。字符串不需要比垃圾回收器所做的更多的管理工作。资源实际上可能需要这样的管理,例如数据库连接、打开的文件等

这里需要注意的是,我们负责终止可观察到的内容,就像我们在使用Create方法时所做的那样。使用create,终止是一个语义问题。using,而不是终止,首先就会破坏使用它的意义。只有在终止时才会释放资源。如果我们没有调用o.onCompleted(),那么序列将被假定仍然是活动的,并且需要它的资源

原文链接:

https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%203%20-%20Taming%20the%20sequence/3.%20Advanced%20error%20handling.md

有什么讨论的内容,可以加我微信公众号:

猜你喜欢

转载自my.oschina.net/u/2277632/blog/1791129
今日推荐