Я пытаюсь определить лучший способ рефакторинга этого кода. Как вы можете видеть, попытка ... поймать .. поймать .. поймать ... строки кода идентичны. Единственное различие между этими двумя методами - это асинхронное, а другое - нет.Как реорганизовать избыточный код catch?
public override int SaveChanges()
{
try
{
return base.SaveChanges();
}
catch (DbEntityValidationException ex)
{
var entityValidationErrors = ex.EntityValidationErrors
.SelectMany(e => e.ValidationErrors)
.Select(x => string.Format("{0} - {1}", x.PropertyName, x.ErrorMessage));
var fullErrorMessage = string.Join(Environment.NewLine, entityValidationErrors);
var exceptionMessage = string.Concat(ex.Message, " Entity validation errors: ", fullErrorMessage);
throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors);
}
catch (DbUpdateConcurrencyException ex)
{
Debug.WriteLine(ex.Message);
throw;
}
catch (DbUpdateException ex)
{
var sqlException = ex.GetBaseException() as SqlException;
if (sqlException == null || sqlException.Errors.Count <= 0)
throw;
var errors = new List<string>();
for (var i = 0; i < sqlException.Errors.Count; i++)
{
errors.Add(string.Format("{0} - {1}", sqlException.Errors[i].Number, sqlException.Errors[i].Message));
}
throw new DbUpdateException(string.Join(Environment.NewLine, errors));
}
}
public override async Task<int> SaveChangesAsync()
{
try
{
return await base.SaveChangesAsync();
}
catch (DbEntityValidationException ex)
{
var entityValidationErrors = ex.EntityValidationErrors
.SelectMany(e => e.ValidationErrors)
.Select(x => string.Format("{0} - {1}", x.PropertyName, x.ErrorMessage));
var fullErrorMessage = string.Join(Environment.NewLine, entityValidationErrors);
var exceptionMessage = string.Concat(ex.Message, " Entity validation errors: ", fullErrorMessage);
throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors);
}
catch (DbUpdateConcurrencyException ex)
{
Debug.WriteLine(ex.Message);
throw;
}
catch (DbUpdateException ex)
{
var sqlException = ex.GetBaseException() as SqlException;
if (sqlException == null || sqlException.Errors.Count <= 0)
throw;
var errors = new List<string>();
for (var i = 0; i < sqlException.Errors.Count; i++)
{
errors.Add(string.Format("{0} - {1}", sqlException.Errors[i].Number, sqlException.Errors[i].Message));
}
throw new DbUpdateException(string.Join(Environment.NewLine, errors));
}
}
Ваш 'SaveChangesAsync' возвращает' Задача '. Это звучит как асинхрон. Уловитель попытки не поймает те же исключения, что и синхронный метод. Если ваша задача async выдает исключение, она не поймает эту попытку ... catch. Вы должны добавить непрерывную задачу, которая обрабатывает исключения. –
... или использовать async/await –
Я обновил сообщение, так что SaveChangesAsync является асинхронным и base.SaveChangesAsync() является ожидаемым, но я до сих пор не понимаю, как избавиться от избыточного кода try/catch/catch/catch , – BBauer42