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

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<Context, CancellationToken, TResult> action, Context context, CancellationToken cancellationToken, IEnumerable<ExceptionPredicate> shouldHandleExceptionPredicates, IEnumerable<ResultPredicate<TResult>> shouldHandleResultPredicates, Action<DelegateResult<TResult>, Context> onFallback, Func<DelegateResult<TResult>, Context, CancellationToken, TResult> fallbackAction) { DelegateResult<TResult> arg; try { cancellationToken.ThrowIfCancellationRequested(); TResult result = (TResult)action(context, 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; Exception ex4 = (from predicate in shouldHandleExceptionPredicates select predicate(ex)).FirstOrDefault((Exception e) => e != null); if (ex4 == null) throw; arg = new DelegateResult<TResult>(ex4); } onFallback(arg, context); return fallbackAction(arg, context, cancellationToken); } internal static async Task<TResult> ImplementationAsync<TResult>(Func<Context, CancellationToken, Task<TResult>> action, Context context, IEnumerable<ExceptionPredicate> shouldHandleExceptionPredicates, IEnumerable<ResultPredicate<TResult>> shouldHandleResultPredicates, Func<DelegateResult<TResult>, Context, Task> onFallbackAsync, Func<DelegateResult<TResult>, Context, CancellationToken, Task<TResult>> fallbackAction, CancellationToken cancellationToken, bool continueOnCapturedContext) { DelegateResult<TResult> delegateOutcome; try { cancellationToken.ThrowIfCancellationRequested(); TResult result = (TResult)(await action(context, cancellationToken).ConfigureAwait(continueOnCapturedContext)); if (!Enumerable.Any<ResultPredicate<TResult>>(shouldHandleResultPredicates, (Func<ResultPredicate<TResult>, bool>)((ResultPredicate<TResult> predicate) => predicate((TResult)result)))) return (TResult)result; delegateOutcome = new DelegateResult<TResult>((TResult)result); } catch (Exception ex2) { Exception ex = ex2; Exception ex3 = Enumerable.FirstOrDefault<Exception>(Enumerable.Select<ExceptionPredicate, Exception>(shouldHandleExceptionPredicates, (Func<ExceptionPredicate, Exception>)((ExceptionPredicate predicate) => predicate(ex))), (Func<Exception, bool>)((Exception e) => e != null)); if (ex3 == null) throw; delegateOutcome = new DelegateResult<TResult>(ex3); } await onFallbackAsync(delegateOutcome, context).ConfigureAwait(continueOnCapturedContext); return await fallbackAction(delegateOutcome, context, cancellationToken).ConfigureAwait(continueOnCapturedContext); } } }