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

ContextualPolicy

public class ContextualPolicy
Transient exception handling policies that can be applied to delegates. These policies can be called with arbitrary context data.
using System; using System.Collections.Generic; using System.Diagnostics; namespace Polly { public class ContextualPolicy { private readonly Action<Action, Context> _exceptionPolicy; internal ContextualPolicy(Action<Action, Context> exceptionPolicy) { if (exceptionPolicy == null) throw new ArgumentNullException("exceptionPolicy"); _exceptionPolicy = exceptionPolicy; } [DebuggerStepThrough] public void Execute(Action action, IDictionary<string, object> contextData) { if (contextData == null) throw new ArgumentNullException("contextData"); Execute(action, new Context(contextData)); } [DebuggerStepThrough] public void Execute(Action action) { Execute(action, Context.Empty); } [DebuggerStepThrough] private void Execute(Action action, Context context) { _exceptionPolicy(action, context); } [DebuggerStepThrough] public TResult Execute<TResult>(Func<TResult> action, IDictionary<string, object> contextData) { if (contextData == null) throw new ArgumentNullException("contextData"); return Execute(action, new Context(contextData)); } [DebuggerStepThrough] public TResult Execute<TResult>(Func<TResult> action) { return Execute(action, Context.Empty); } [DebuggerStepThrough] private TResult Execute<TResult>(Func<TResult> action, Context context) { TResult result = (TResult)default(TResult); _exceptionPolicy(delegate { result = (TResult)action(); }, context); return (TResult)result; } } }