public async Task RunWithHandlingAsync()

in src/library/Client/ServiceClients/ExceptionStrategies/KubernetesRestClientExceptionStrategy.cs [49:133]


        public async Task<T> RunWithHandlingAsync<T>(Func<Task<T>> func, FailureConfig failureConfig)
        {
            if (failureConfig == null)
            {
                throw new ArgumentNullException(nameof(failureConfig));
            }

            try
            {
                return await func();
            }
            catch (OperationCanceledException e)
            {
                var args = new FailureConfig.RecognizedExceptionArgs(e, _log);
                failureConfig.RecognizedExceptionCallback?.Invoke(args);
                _log.ExceptionAsWarning(e);
                if (args.Handled)
                {
                    return default(T);
                }
                throw;
            }
            catch (InvalidOperationException e)
            {
                var args = new FailureConfig.RecognizedExceptionArgs(e, _log);
                failureConfig.RecognizedExceptionCallback?.Invoke(args);

                _log.Warning(failureConfig.FailureFormat, failureConfig.FailureMessageArgs);
                string validationMessage = e.Message;
                if (!string.IsNullOrEmpty(failureConfig.ValidationFailureFormat))
                {
                    validationMessage = $"{failureConfig.ValidationFailureFormat} - {e.Message}";
                }
                var newEx = new ValidationException(_operationContext, e, validationMessage, failureConfig.ValidationFailureArgs);
                _log.ExceptionAsWarning(newEx);

                if (args.Handled)
                {
                    return default(T);
                }
                throw newEx;
            }
            catch (InvalidKubeConfigFileException e)
            {
                var args = new FailureConfig.RecognizedExceptionArgs(e, _log);
                failureConfig.RecognizedExceptionCallback?.Invoke(args);

                _log.Warning(failureConfig.FailureFormat, failureConfig.FailureMessageArgs);
                string validationMessage = e.Message;
                if (!string.IsNullOrEmpty(failureConfig.ValidationFailureFormat))
                {
                    validationMessage = $"{failureConfig.ValidationFailureFormat} - {e.Message}";
                }
                var newEx = new ValidationException(_operationContext, e, validationMessage, failureConfig.ValidationFailureArgs);
                _log.ExceptionAsWarning(newEx);

                if (args.Handled)
                {
                    return default(T);
                }
                throw newEx;
            }
            catch (Exception e) when (e is IUserVisibleExceptionReporter)
            {
                var args = new FailureConfig.RecognizedExceptionArgs(e, _log);
                failureConfig.RecognizedExceptionCallback?.Invoke(args);

                _log.Warning(failureConfig.FailureFormat, failureConfig.FailureMessageArgs);
                _log.ExceptionAsWarning(e);
                if (args.Handled)
                {
                    return default(T);
                }
                throw;
            }
            catch (Exception e)
            {
                // Unrecognized exception
                failureConfig.UnhandledExceptionCallback?.Invoke(e);

                _log.Error(failureConfig.FailureFormat, failureConfig.FailureMessageArgs);
                _log.Exception(e);
                throw;
            }
        }