Kiedy wyjątek jest wywoływany przez własny kod wywoływany z działania kontrolera, w jaki sposób należy go obsłużyć? Widzę wiele przykładów najlepszych praktyk, w których nie ma żadnych instrukcji try-catch. Na przykład, dostęp do danych z repozytorium:Obsługa wyjątków w kontrolerze (ASP.NET MVC)
public ViewResult Index()
{
IList<CustomModel> customModels = _customModelRepository.GetAll();
return View(customModels);
}
Oczywiście ten kod może rzucić wyjątek, jeśli połączenie jest do bazy danych, która nie ma dostępu i korzystania z Entity Framework ORM jak np.
Jednak wszystko, co mogę zobaczyć, stanie się faktem, że wyjątek pojawi się i wyświetli nieprzyjemny komunikat o błędzie dla użytkownika.
Jestem świadomy atrybutu HandleError, ale rozumiem, że jest używany głównie do przekierowania do strony błędu, jeśli wystąpi wyjątek, który jest nieobsługiwany.
Oczywiście, ten kod może być owinięty w try-catch, ale nie oddzielają ładnie, zwłaszcza jeśli masz więcej logiki:
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();
}
Wcześniej zostały wyodrębnione wszystkie kod, który mógłby rzucić wyjątki, takie jak wywołania bazy danych do klasy DataProvider, która obsługuje błędy i odsyła wiadomości w celu wyświetlenia komunikatów dla użytkownika.
Zastanawiałem się, jaki jest najlepszy sposób, aby to zrobić? Nie zawsze chcę powracać do strony błędu, ponieważ niektóre wyjątki nie powinny tego robić. Zamiast tego powinien być wyświetlany komunikat o błędzie z normalnym widokiem. Czy moja poprzednia metoda była poprawna lub czy istnieje lepsze rozwiązanie?
Zgadzam się również z odpowiedzią Patricka Desjardins': nadrzędnymi OnException to świetny sposób na obsługę błędów. Zwłaszcza jeśli znajduje się w kontrolerze bazowym, z którego dziedziczą wszystkie inne kontrolery. – NovaJoe