Ejemplo n.º 1
0
        /// <summary>
        /// Выполянть функции из аргументов, пока не встретиться функция не кидающая исключения или функции не закончатся.
        /// Исключения всех функций записываются в лог с warning левел. Исключение из последней доступной функции летит ниже.
        /// </summary>
        public static T Try <T>(string operation, IEnumerable <Func <T> > funcs)
        {
            var       _ = funcs ?? throw new ArgumentNullException(nameof(funcs));
            Exception lastIterationException = null;
            int       iteration = 0;

            foreach (var func in funcs)
            {
                try
                {
                    lastIterationException = null;
                    ++iteration;
                    var __ = func ?? throw new NullReferenceException(nameof(func));
                    return(func());
                }
                catch (Exception ex)
                {
                    var opName = $"{nameof(TryChain)} for operation " + operation + " on iteration " + iteration;
                    lastIterationException = ex;
                    CurrentLogger.WriteLog(opName + ": " + CurrentLogger.ExtractExceptionMessage(ex), System.Diagnostics.TraceEventType.Warning);
                }
            }
            if (!(lastIterationException is null))
            {
                var opName = $"{nameof(TryChain)} for operation " + operation + " on iteration " + iteration;
                CurrentLogger.LogEx(opName, lastIterationException);
                throw lastIterationException;
            }
            throw new ArgumentException($"{nameof(funcs)} for {nameof(TryChain)} with empty list");
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Выполянть функции из аргументов, пока не встретиться функция не кидающая исключения или функции не закончатся.
        /// Исключения всех функций записываются в лог с warning левел. Исключение из последней доступной функции летит ниже.
        /// </summary>
        public static T Try <T>(string operation, params Func <T>[] funcs)
        {
            var _ = funcs ?? throw new ArgumentNullException(nameof(funcs));
            var remainFuncAmount = funcs.Count();

            foreach (var func in funcs)
            {
                try
                {
                    --remainFuncAmount;
                    var __ = func ?? throw new NullReferenceException(nameof(func));
                    return(func());
                }
                catch (Exception ex)
                {
                    var opName = $"{nameof(TryChain)} with function number {funcs.Count() - remainFuncAmount} for operation " + operation;
                    if (remainFuncAmount <= 0)
                    {
                        CurrentLogger.LogEx(opName, ex);
                        throw ex;
                    }
                    CurrentLogger.WriteLog(opName + ": " + CurrentLogger.ExtractExceptionMessage(ex), System.Diagnostics.TraceEventType.Warning);
                }
            }
            throw new ArgumentException($"{nameof(funcs)} for {nameof(TryChain)} with empty list");
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Выполянть функции из аргументов, пока не встретиться функция не кидающая исключения, возвращающая подходящщее
        /// предикату IsSuitValue значение или функции не закончатся.
        /// Если IsSuitValue == null, то предикат подтверждает любые значения не равные default(T) (например null).
        /// Исключения всех функций записываются в лог с warning левел. Исключение из последней доступной функции летит ниже.
        /// Если не нашли ни одну функцию удовлетворяющую предикату, то летит исключение по нехватки функций
        /// </summary>
        public static T TryWhileNotPredicate <T>(string operation, Predicate <T> IsSuitValue, params Func <T>[] funcs)
        {
            var _ = funcs ?? throw new ArgumentNullException(nameof(funcs));

            IsSuitValue = IsSuitValue ?? new Predicate <T> (result => !Object.Equals(result, default(T)));
            var remainFuncAmount = funcs.Count();

            foreach (var func in funcs)
            {
                try
                {
                    --remainFuncAmount;
                    var __     = func ?? throw new NullReferenceException(nameof(func));
                    var result = func();
                    if (IsSuitValue(result))
                    {
                        return(result);
                    }
                }
                catch (Exception ex)
                {
                    var opName = $"{nameof(TryChain)} with function number {funcs.Count() - remainFuncAmount} for operation " + operation;
                    if (remainFuncAmount <= 0)
                    {
                        CurrentLogger.LogEx(opName, ex);
                        throw ex;
                    }
                    CurrentLogger.WriteLog(opName + ": " + CurrentLogger.ExtractExceptionMessage(ex), System.Diagnostics.TraceEventType.Warning);
                }
            }
            throw new Exception($"{nameof(funcs)} for {nameof(TryChain)} list is exceeded");
        }