使用Catch
运算符很容易处理一组特定的异常。我们如何才能忽略某些异常,而在Catch
块中处理其余异常?
例如,我想让ArgumentNullException
,ArgumentOutOfRangeException
和TimeoutException
异常冒泡并报告一个错误,但对于其他任何事情,我想重试。
下面的catch版本将捕获所有异常,并且没有办法选择性地忽略某些类型,因为签名要求它返回IObservable<T>
source.Catch<T, Exception>(e=> Observable.Return(default(T)))
如果我必须重试某些异常,则可以编写类似(我认为)的内容
source.Catch<T, WebException>(e=> source.Retry())
在这种情况下,一个非常有意义的运算符是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))