Я пытался реализовать базовую логику повторов для простого сетевого потока.Идея состоит в том, что есть три типа исключений, которые нужно обработать:
- Переходные исключения, следует повторно подключиться и повторить попытку
- Соединение с постоянной ошибкой, должно распространиться и позволить процессу умереть
- Исключения, которые следует проглотить и завершить наблюдаемое
При создании эскиза я получаю что-то вроде
var retriedObservable = observable.RetryWhen(x => x.SelectMany(ex =>
{
if (ex is ShouldCompleteException)
{
return Observable.Return<Exception>(null);
}
else if (ex is TransientNetworkException)
{
return Observable.Return(ex).Delay(TimeSpan.FromSeconds(1));
}
else
{
return Observable.Throw<Exception>(ex);
}
}).TakeUntil(ex => ex == null));
Редактировать: этот пример сильно упрощен, показывая только три типичных шаблона обработки ошибок, которые я вижу в своем коде.В реальном мире, конечно, есть намного больше.
Код работает, но выглядит слишком сложным, и я не уверен, ударит ли мне специальное значение «ноль» по лицув какой-то момент.
Я также попробовал комбинации .Where()
и .Merge()
, но код быстро становится нечитаемым.
Есть ли более чистый (то есть более канонический) способ выполнить эту базовуюобработка ошибок?