【问题标题】:Rx.Net ignore certain exceptions but handle rest of the exceptionsRx.Net 忽略某些异常但处理其余异常
【发布时间】:2020-02-16 21:54:05
【问题描述】:

使用Catch 运算符可以轻松处理一组特定的异常。我们怎样才能忽略某些异常,而在 Catch 块中处理其余的异常?

例如,我想让ArgumentNullExceptionArgumentOutOfRangeExceptionTimeoutException 异常冒泡并报告错误,但对于其他任何事情我想重试。

下面的 catch 版本会捕获所有异常,并且无法选择性地忽略某些类型,因为签名要求它返回 IObservable<T>

source.Catch<T, Exception>(e=> Observable.Return(default(T)))

如果我必须重试某些异常,那么我可以编写类似(我认为)的东西

source.Catch<T, WebException>(e=> source.Retry())

【问题讨论】:

  • 添加一个代码示例,如果您想在单个命令中执行此检查,例如很难进行多次尝试。流中是否发生此异常?
  • 我好像找到了,没注意Throw签名。这里是return source.Catch&lt;T,Exception&gt;(e =&gt; { return e is TimeoutException ? source.Retry() : Observable.Throw&lt;T&gt;(e); });

标签: system.reactive


【解决方案1】:

在这些情况下一个非常有意义的运算符是RetryWhen

RetryWhen(selector) 为您提供 Exception 的 observable,并期望 observable 在每次产生值时触发重试。

RetryWhen(e =&gt; e) 等价于Retry()(所有异常都会触发重试)。

RetryWhen(e =&gt; e.Take(3)) 等价于Retry(3)(前三个异常触发重试)。

现在您可以简单地将内部序列转换为发出您想要的异常类型的序列。例如,只重试TimeoutException

source.RetryWhen(e => e.Where(exn => exn is TimeoutException))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 2015-02-18
    • 2015-04-14
    • 2014-09-07
    • 2011-07-02
    • 1970-01-01
    相关资源
    最近更新 更多