Rx. Net игнорировать определенные исключения, но обрабатывать остальные исключения - PullRequest
1 голос
/ 14 февраля 2020

С определенным набором исключений легко обращаться с помощью оператора Catch. Как мы можем игнорировать определенные исключения, но обрабатывать остальные в блоке Catch?

Скажем, например, я хотел бы, чтобы исключения ArgumentNullException, ArgumentOutOfRangeException и TimeoutException всплыли и сообщали об ошибке, но для что-нибудь еще, что я хотел бы повторить.

Версия catch ниже будет перехватывать все исключения, и нет способа выборочно игнорировать некоторые типы, поскольку подпись требует, чтобы она возвращала IObservable<T>

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

Если мне придется повторить попытку определенного исключения, я мог бы написать что-то вроде (я думаю)

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

1 Ответ

2 голосов
/ 16 февраля 2020

Очень значимый оператор в этих ситуациях: 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))
...