<PackageReference Include="Polly" Version="5.0.6" />

FallbackEngine

static class FallbackEngine
using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace Polly.Fallback { internal static class FallbackEngine { internal static TResult Implementation<TResult>(Func<CancellationToken, TResult> action, Context context, CancellationToken cancellationToken, IEnumerable<ExceptionPredicate> shouldHandleExceptionPredicates, IEnumerable<ResultPredicate<TResult>> shouldHandleResultPredicates, Action<DelegateResult<TResult>, Context> onFallback, Func<CancellationToken, TResult> fallbackAction) { DelegateResult<TResult> arg; try { cancellationToken.ThrowIfCancellationRequested(); TResult result = (TResult)action(cancellationToken); if (!shouldHandleResultPredicates.Any((ResultPredicate<TResult> predicate) => predicate((TResult)result))) return (TResult)result; arg = new DelegateResult<TResult>((TResult)result); } catch (Exception ex2) { Exception ex; Exception ex3 = ex = ex2; if (!shouldHandleExceptionPredicates.Any((ExceptionPredicate predicate) => predicate(ex))) throw; arg = new DelegateResult<TResult>(ex); } onFallback(arg, context); return fallbackAction(cancellationToken); } internal static async Task<TResult> ImplementationAsync<TResult>(Func<CancellationToken, Task<TResult>> action, Context context, IEnumerable<ExceptionPredicate> shouldHandleExceptionPredicates, IEnumerable<ResultPredicate<TResult>> shouldHandleResultPredicates, Func<DelegateResult<TResult>, Context, Task> onFallbackAsync, Func<CancellationToken, Task<TResult>> fallbackAction, CancellationToken cancellationToken, bool continueOnCapturedContext) { DelegateResult<TResult> arg; try { cancellationToken.ThrowIfCancellationRequested(); <>c__DisplayClass1_0<TResult> <>c__DisplayClass1_; TResult result2 = <>c__DisplayClass1_.result; TResult result; TResult val = (TResult)(result = (TResult)(await action(cancellationToken).ConfigureAwait(continueOnCapturedContext))); if (!Enumerable.Any<ResultPredicate<TResult>>(shouldHandleResultPredicates, (Func<ResultPredicate<TResult>, bool>)((ResultPredicate<TResult> predicate) => predicate((TResult)result)))) return (TResult)result; arg = new DelegateResult<TResult>((TResult)result); } catch (Exception ex2) { Exception ex = ex2; if (!Enumerable.Any<ExceptionPredicate>(shouldHandleExceptionPredicates, (Func<ExceptionPredicate, bool>)((ExceptionPredicate predicate) => predicate(ex)))) throw; arg = new DelegateResult<TResult>(ex); } await onFallbackAsync(arg, context).ConfigureAwait(continueOnCapturedContext); return await fallbackAction(cancellationToken).ConfigureAwait(continueOnCapturedContext); } } }