Когда исключение генерируется вашим собственным кодом, вызываемым из действия контроллера, как это должно быть обработано? Я вижу множество примеров лучших практик, в которых вообще нет заявлений о попытках. Например, доступ к данным из репозитория:
public ViewResult Index()
{
IList<CustomModel> customModels = _customModelRepository.GetAll();
return View(customModels);
}
Очевидно, что этот код может генерировать исключение, если вызов относится к базе данных, к которой он не может получить доступ, и мы используем ORM, например, Entity Framework.
Однако все, что я вижу, будет состоять в том, что исключение будет пузыриться и отображать неприятное сообщение об ошибке для пользователя.
Мне известно об атрибуте HandleError, но я понимаю, что в основном используется для перенаправления на страницу с ошибкой, если происходит исключение, которое необработанное.
Конечно, этот код можно было бы обернуть в try-catch, но он не будет отлично отделяться, особенно если у вас больше логики:
public ViewResult Index()
{
if (ValidationCheck())
{
IList<CustomModel> customModels = new List<CustomModel>();
try
{
customModels = _customModelRepository.GetAll();
}
catch (SqlException ex)
{
// Handle exception
}
if (CustomModelsAreValid(customModels))
// Do something
else
// Do something else
}
return View();
}
Раньше я извлекал весь код, который мог бы вызывать исключения, такие как вызовы базы данных, в класс DataProvider, который обрабатывает ошибки и возвращает сообщения для отображения сообщений пользователю.
Мне было интересно, какой лучший способ справиться с этим? Я не всегда хочу вернуться на страницу с ошибкой, потому что некоторые исключения не должны этого делать. Вместо этого сообщение об ошибке для пользователя должно отображаться с нормальным представлением. Был ли мой предыдущий метод правильным или есть лучшее решение?