Вот ключевая область, в которой мне нужны рекомендации:
Проблема: эффективная обработка ошибок
Мой метод в настоящее время генерирует исключения (например, ApiException) для проверки и других проблем (например, отсутствие учетных данных, ошибка создания пользователя, проблемы с отправкой электронной почты).
кидает исключения для ошибок проверки или бизнес-логики — эффективный подход в EF Core и ASP.NET Core? Если нет, то какой шаблон рекомендуется обрабатывать в таких случаях, сохраняя при этом чистый и поддерживаемый код?
Проблема: удобные для пользователя ответы на ошибки
Когда UserManager такие методы, как CreateAsync или AddToRoleAsync, терпят неудачу, они предоставляют подробные описания ошибок. Должны ли они быть возвращены непосредственно пользователю или вместо этого мне следует создавать собственные, удобные для пользователя сообщения?
Если пользовательские сообщения лучше, каков наилучший способ сопоставить исключения или сведения об ошибках из UserManager в осмысленные и удобные для пользователя сообщения? ответы?
вот мой код, помогите мне сделать это правильно.
Примечания:
- Я использую глобальный обработчик исключений
{
using var transaction = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled);
if (string.IsNullOrEmpty(email) ||
string.IsNullOrEmpty(userName))
{
logger.LogInformation("user didn't fill credentials");
throw new ApiException
{
statusCode = StatusCodes.Status400BadRequest,
errors = new[] { "user didn't fill credentials".ToUpper() },
title = "missing credentials".ToUpper()
};
}
var userToBeRegistered = new User
{
Email = email, UserName = userName,
ipAddress = ipAddress.ToString()
};
var response = await userManager.CreateAsync(userToBeRegistered);
if (!response.Succeeded)
{
var errors = response.Errors.Select(error => error.Description).ToList();
logger.LogInformation(string.Join(", ", errors));
throw new ApiException
{
statusCode = StatusCodes.Status400BadRequest,
errors = response.Errors.Select(error => error.Description),
title = "Registration Error".ToUpper()
};
}
var emailSentStatus = await emailService.sendRegistrationEmailAsync(email, userToBeRegistered.Id);
if (!emailSentStatus)
{
logger.LogInformation("error in send registration email method (email service)");
throw new ApiException
{
statusCode = StatusCodes.Status400BadRequest,
errors = new[] { "error while sending confirmation email please retry again later" },
title = "registration email error".ToUpper()
};
}
var addRoleToUserStatus = await userManager.AddToRoleAsync(userToBeRegistered, role);
if (!addRoleToUserStatus.Succeeded)
{
logger.LogInformation("error in add to role method (user manager)");
throw new ApiException
{
statusCode = StatusCodes.Status400BadRequest,
errors = new[] { "unknown error occurred".ToUpper() },
title = "missing credentials".ToUpper()
};
}
var userDTo = new UserDto();
userDTo = userToBeRegistered.Adapt();
transaction.Complete();
return userDTo;
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... n-handling
Мобильная версия