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;
using System.Threading;
using System.Threading.Tasks;
namespace Polly
{
public class ContextualPolicy : Policy
{
internal ContextualPolicy(Action<Action, Context> exceptionPolicy, IEnumerable<ExceptionPredicate> exceptionPredicates)
: base(exceptionPolicy, exceptionPredicates)
{
}
[DebuggerStepThrough]
public void Execute(Action action, IDictionary<string, object> contextData)
{
if (contextData == null)
throw new ArgumentNullException("contextData");
base.Execute(action, new Context(contextData));
}
[DebuggerStepThrough]
public TResult Execute<TResult>(Func<TResult> action, IDictionary<string, object> contextData)
{
if (contextData == null)
throw new ArgumentNullException("contextData");
return base.Execute(action, new Context(contextData));
}
internal ContextualPolicy(Func<Func<CancellationToken, Task>, Context, CancellationToken, bool, Task> asyncExceptionPolicy, IEnumerable<ExceptionPredicate> exceptionPredicates)
: base(asyncExceptionPolicy, exceptionPredicates)
{
}
[DebuggerStepThrough]
public Task ExecuteAsync(Func<Task> action, IDictionary<string, object> contextData)
{
return ExecuteAsync((CancellationToken ct) => action(), contextData, CancellationToken.None, false);
}
[DebuggerStepThrough]
public Task ExecuteAsync(Func<Task> action, IDictionary<string, object> contextData, bool continueOnCapturedContext)
{
return ExecuteAsync((CancellationToken ct) => action(), contextData, CancellationToken.None, continueOnCapturedContext);
}
[DebuggerStepThrough]
public Task ExecuteAsync(Func<CancellationToken, Task> action, IDictionary<string, object> contextData, CancellationToken cancellationToken)
{
return ExecuteAsync(action, contextData, cancellationToken, false);
}
[DebuggerStepThrough]
public Task ExecuteAsync(Func<CancellationToken, Task> action, IDictionary<string, object> contextData, CancellationToken cancellationToken, bool continueOnCapturedContext)
{
if (contextData == null)
throw new ArgumentNullException("contextData");
return base.ExecuteAsync(action, new Context(contextData), cancellationToken, continueOnCapturedContext);
}
[DebuggerStepThrough]
public Task<TResult> ExecuteAsync<TResult>(Func<Task<TResult>> action, IDictionary<string, object> contextData)
{
return ExecuteAsync((CancellationToken ct) => action(), contextData, CancellationToken.None, false);
}
[DebuggerStepThrough]
public Task<TResult> ExecuteAsync<TResult>(Func<Task<TResult>> action, IDictionary<string, object> contextData, bool continueOnCapturedContext)
{
return ExecuteAsync((CancellationToken ct) => action(), contextData, CancellationToken.None, continueOnCapturedContext);
}
[DebuggerStepThrough]
public Task<TResult> ExecuteAsync<TResult>(Func<CancellationToken, Task<TResult>> action, IDictionary<string, object> contextData, CancellationToken cancellationToken)
{
return ExecuteAsync(action, contextData, cancellationToken, false);
}
[DebuggerStepThrough]
public Task<TResult> ExecuteAsync<TResult>(Func<CancellationToken, Task<TResult>> action, IDictionary<string, object> contextData, CancellationToken cancellationToken, bool continueOnCapturedContext)
{
if (contextData == null)
throw new ArgumentNullException("contextData");
return base.ExecuteAsync(action, new Context(contextData), cancellationToken, continueOnCapturedContext);
}
}
}