Rx.Net 忽略某些异常但处理其余异常
Rx.Net ignore certain exceptions but handle rest of the exceptions
使用 Catch
运算符可以轻松处理一组特定的异常。我们如何才能忽略某些异常,而在 Catch
块中处理其余异常?
举例来说,我想让 ArgumentNullException
、ArgumentOutOfRangeException
和 TimeoutException
异常冒泡并报告错误,但对于其他任何事情我都想重试。
下面的 catch 版本会捕获所有异常,并且无法选择性地忽略某些类型,因为签名需要它 return a 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))
使用 Catch
运算符可以轻松处理一组特定的异常。我们如何才能忽略某些异常,而在 Catch
块中处理其余异常?
举例来说,我想让 ArgumentNullException
、ArgumentOutOfRangeException
和 TimeoutException
异常冒泡并报告错误,但对于其他任何事情我都想重试。
下面的 catch 版本会捕获所有异常,并且无法选择性地忽略某些类型,因为签名需要它 return a 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))