public override async Task <TReturn> HandleExceptionAsync <TReturn>(Func <CancellationToken, Task <TReturn> > func, CancellationToken funcCancellationToken = default, Func <CancellationToken, Task> onExceptionCompensatingHandler = null, CancellationToken onExceptionCompensatingHandlerCancellationToken = default) { Task <TReturn> returnValue = default; try { var returnValueFromFunc = await func(funcCancellationToken); if (returnValueFromFunc is Task <TReturn> ) { returnValue = returnValueFromFunc as Task <TReturn>; } else { returnValue = Task.FromResult(returnValueFromFunc); } } catch (Exception ex) { returnValue = await ExceptionHandlingUtility.WrapFuncWithExceptionHandling(async() => { if (CheckIfExceptionsNeedsToBePollyHandled(ex)) { AsyncPolicyWrap policyWrap = GetPolicyWrapWithProperFallbackActionSetForFallbackPoliciesAsync(ex, onExceptionCompensatingHandler); return(await policyWrap.ExecuteAsync(func, funcCancellationToken) as Task <TReturn>); } return(default(Task <TReturn>)); }, _logger); await HandleExceptionWithThrowCondition(ex, onExceptionCompensatingHandler, onExceptionCompensatingHandlerCancellationToken); } return(await returnValue); }
private static PolicyBuilder BuildPolicyBuilderFromPollyTransientFailureExceptionsXMLFile() { return(ExceptionHandlingUtility.WrapFuncWithExceptionHandling(() => { PolicyBuilder policyBuilder = null; XDocument xDoc = XDocument.Load(Path.Combine(typeof(BasicPollyExceptionHandler).Assembly.Location, "ExceptionHandling", "PollyBasedExceptionHandling", "PollyTransientFailureExceptions.xml")); _pollyTransientFailureExceptions = XMLUtility.DeSerialize <PollyTransientFailureExceptions>(xDoc.ToString()); _splittedTransientFailureExceptions = _pollyTransientFailureExceptions.TransientFailureExceptions.SelectMany(x => x.CommaSeperatedTransientFailureExceptions.Split(",", StringSplitOptions.RemoveEmptyEntries)).Distinct(); if (_splittedTransientFailureExceptions.IsNotNullOrEmpty()) { string firstTransientFailureException = _splittedTransientFailureExceptions.First(); string assemblyName = _pollyTransientFailureExceptions.TransientFailureExceptions.SingleOrDefault(x => x.CommaSeperatedTransientFailureExceptions.Contains(firstTransientFailureException)).AssemblyName; Type firstTransientFailureExceptionType = MetaDataUtility.GetType(assemblyName, firstTransientFailureException); Type[] transientFailureExceptionTypesArray = new Type[1]; transientFailureExceptionTypesArray[0] = firstTransientFailureExceptionType; policyBuilder = MetaDataUtility.InvokeStaticMethod <Policy, PolicyBuilder>("Handle", transientFailureExceptionTypesArray); IEnumerable <string> transientFailureExceptionsOtherThanTheFirst = _splittedTransientFailureExceptions.Skip(1); if (transientFailureExceptionsOtherThanTheFirst.IsNotNullOrEmpty()) { transientFailureExceptionsOtherThanTheFirst.ForEach(x => { assemblyName = _pollyTransientFailureExceptions.TransientFailureExceptions.SingleOrDefault(y => y.CommaSeperatedTransientFailureExceptions.Contains(x)).AssemblyName; Type transientFailureExceptionTypeForOtherThanTheFirst = MetaDataUtility.GetType(assemblyName, x); Type[] transientFailureExceptionTypesArrayForOtherThanTheFirst = new Type[1]; transientFailureExceptionTypesArrayForOtherThanTheFirst[0] = transientFailureExceptionTypeForOtherThanTheFirst; policyBuilder = MetaDataUtility.InvokeInstanceMethod <PolicyBuilder, PolicyBuilder>(policyBuilder, "Or", transientFailureExceptionTypesArrayForOtherThanTheFirst); } ); } } return policyBuilder; }, _staticLoggerInstance)); }
public override TReturn HandleException <TReturn>(Func <TReturn> action, Action onExceptionCompensatingHandler = null) { TReturn returnValue = default(TReturn); try { returnValue = action(); } catch (Exception ex) { returnValue = ExceptionHandlingUtility.WrapFuncWithExceptionHandling(() => { if (CheckIfExceptionsNeedsToBePollyHandled(ex)) { PolicyWrap policyWrap = GetPolicyWrapWithProperFallbackActionSetForFallbackPolicies(ex, onExceptionCompensatingHandler); return(policyWrap.Execute(action)); } return(default(TReturn)); }, _logger); HandleExceptionWithThrowCondition(ex, onExceptionCompensatingHandler); } return(returnValue); }
public override TReturn HandleException <TReturn>(Func <TReturn> action, Action onExceptionCompensatingHandler = null) { TReturn returnValue = default(TReturn); try { returnValue = action(); } catch (Exception ex) { returnValue = ExceptionHandlingUtility.WrapFuncWithExceptionHandling(() => { if (_splittedTransientFailureExceptions.IsNotNullOrEmpty() && _splittedTransientFailureExceptions.Contains(ex.GetType().Name) && _policies.IsNotNullOrEmpty()) { PolicyWrap policyWrap = GetPolicyWrapWithProperFallbackActionSetForFallbackPolicies(ex, onExceptionCompensatingHandler); return(policyWrap.Execute(action)); } return(default(TReturn)); }, _logger); HandleExceptionWithThrowCondition(ex, onExceptionCompensatingHandler); } return(returnValue); }
public override async Task <TReturn> HandleExceptionAsync <TReturn>(Func <CancellationToken, Task <TReturn> > func, CancellationToken funcCancellationToken = default(CancellationToken), Func <CancellationToken, Task> onExceptionCompensatingHandler = null, CancellationToken onExceptionCompensatingHandlerCancellationToken = default(CancellationToken)) { Task <TReturn> returnValue = default(Task <TReturn>); try { returnValue = await func(funcCancellationToken) as Task <TReturn>; } catch (Exception ex) { returnValue = await ExceptionHandlingUtility.WrapFuncWithExceptionHandling(async() => { if (_splittedTransientFailureExceptions.IsNotNullOrEmpty() && _splittedTransientFailureExceptions.Contains(ex.GetType().Name) && _policies.IsNotNullOrEmpty()) { PolicyWrap policyWrap = GetPolicyWrapWithProperFallbackActionSetForFallbackPoliciesAsync(ex, onExceptionCompensatingHandler); return(await policyWrap.ExecuteAsync(func, funcCancellationToken) as Task <TReturn>); } return(default(Task <TReturn>)); }, _logger); await HandleExceptionWithThrowCondition(ex, onExceptionCompensatingHandler, onExceptionCompensatingHandlerCancellationToken); } return(await returnValue); }