Rx.Net忽略某些例外,但处理其余例外

问题描述 投票:1回答:1

使用Catch运算符很容易处理一组特定的异常。我们如何才能忽略某些异常,而在Catch块中处理其余异常?

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

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

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

如果我必须重试某些异常,则可以编写类似(我认为)的内容

source.Catch<T, WebException>(e=> source.Retry())
system.reactive
1个回答
0
投票

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

[RetryWhen(selector)为您提供Exception的可观察值,并期望有一个可观察值,它在每次产生值时都会触发重试。

[RetryWhen(e => e)等同于Retry()(所有异常都会触发重试)。

[RetryWhen(e => e.Take(3))等效于Retry(3)(前三个异常触发重试)。

现在,您可以简单地将内部序列转换为根据所需的异常类型发出的序列。例如,仅重试TimeoutException

source.RetryWhen(e => e.Where(exn => exn is TimeoutException))
© www.soinside.com 2019 - 2024. All rights reserved.