/// <summary> /// Сохранить изменения в БД асинхронно, при возникновении исключения, сохранить ошибку. /// и параметры, вызвавшие исключение. /// </summary> /// <typeparam name="TLoggedClass">Логируемый класс</typeparam> /// <param name="context">Расширяемый класс (DBContext)</param> /// <param name="logShortMessage">Сообщение для логгера</param> /// <param name="cancellationToken">Токен отмены</param> /// <returns></returns> internal static async Task <int> SaveChangesAndLogErrorAsync <TLoggedClass>(this IDBSource context, LogShortMessage logShortMessage, CancellationToken cancellationToken) where TLoggedClass : class { ILogger <TLoggedClass> logger = MKKContext.LoggerFactory.CreateLogger <TLoggedClass>(); LoggedMessage <TLoggedClass> loggedMessage = new LoggedMessage <TLoggedClass>(logger, logShortMessage.Message, logShortMessage.Params); return(await context.SaveChangesAndLogErrorAsync(loggedMessage, cancellationToken)); }
/// <summary> /// Вызвать метод, при возникновении ошибки залогировать её и отправить на клиент описание исключения /// </summary> /// <typeparam name="TLoggerClass">Класс логгера</typeparam> /// <param name="action">Обрабатываемый метод</param> /// <param name="logShortMessage">Дополнительное сообщение для логгера. Может быть пустым</param> /// <returns>Результат выполнения функции</returns> public static void ExecuteWithTryCatch <TLoggerClass>(Action action, LogShortMessage logShortMessage = default) where TLoggerClass : class { try { action(); } catch (PDNAnketaNotFoundException ex) { ThrowFaultException(ex); } catch (Exception exception) { LogException <TLoggerClass>(exception, logShortMessage); ThrowFaultException(exception); } }
/// <summary> /// Вызвать метод асинхронно с возвращаемым параметром, при возникновении ошибки залогировать её и отправить /// на клиент описание исключения. /// </summary> /// <param name="actionAsync">Обрабатываемый метод</param> /// <param name="logShortMessage">Дополнительное сообщение для логгера. Может быть пустым</param> /// <typeparam name="TLoggerClass">Класс логгера</typeparam> /// <typeparam name="TResult">Тип возвращаемого значения</typeparam> /// <returns>Результат выполнения функции</returns> public static async Task <TResult> ExecuteWithTryCatchAsync <TResult, TLoggerClass>( Func <Task <TResult> > actionAsync, LogShortMessage logShortMessage = default) where TLoggerClass : class { try { return(await actionAsync()); } catch (PDNAnketaNotFoundException exception) { ThrowFaultException(exception); } catch (Exception exception) { LogException <TLoggerClass>(exception, logShortMessage); ThrowFaultException(exception); } return(default);
/// <summary> /// Записать исключение в лог. /// </summary> /// <param name="exception">Логируемое исключение</param> /// <param name="logShortMessage">Дополнительное сообщение для логгера. Может быть пустым</param> /// <typeparam name="TLoggerClass">Класс логгера</typeparam> private static void LogException <TLoggerClass>(Exception exception, LogShortMessage logShortMessage = default) where TLoggerClass : class { ILogger <TLoggerClass> logger = ServiceMethod.LoggerFactory.CreateLogger <TLoggerClass>(); List <object> @params = new List <object>(); string message = "Ошибка выполнения. Exception: {Exception}."; if (!logShortMessage.Equals(default(LogShortMessage))) { message = logShortMessage.Message + Environment.NewLine + "Ошибка выполнения. Exception: {Exception}."; if ((logShortMessage.Params?.Length ?? 0) > 0) { @params.AddRange(logShortMessage.Params); } } @params.Add(exception); logger.LogError(message, @params.ToArray()); }
/// <summary> /// Вызвать метод, при возникновении ошибки залогировать её и отправить на клиент описание исключения /// </summary> /// <typeparam name="TResult">Тип возвращаемого параметра</typeparam> /// <typeparam name="TLoggerClass">Класс логгера</typeparam> /// <param name="func">Выполняемая функция</param> /// <param name="logShortMessage">Дополнительное сообщение для логгера. Может быть пустым</param> /// <returns>Результат выполнения функции</returns> public static TResult ExecuteWithTryCatch <TResult, TLoggerClass>(Func <TResult> func, LogShortMessage logShortMessage = default) where TLoggerClass : class { TResult result = default; try { result = func(); } catch (PDNAnketaNotFoundException ex) { ThrowFaultException(ex); } catch (Exception exception) { LogException <TLoggerClass>(exception, logShortMessage); ThrowFaultException(exception); } return(result); }