Quando un'eccezione viene generata dal proprio codice richiamato da un'azione in un controller come dovrebbe essere gestito? Vedo un sacco di esempi di buone pratiche in cui non esistono affatto dichiarazioni di prova. Ad esempio, l'accesso ai dati da un repository:Gestione delle eccezioni nel controller (ASP.NET MVC)
public ViewResult Index()
{
IList<CustomModel> customModels = _customModelRepository.GetAll();
return View(customModels);
}
Chiaramente questo codice potrebbe gettare un'eccezione se la chiamata è a un database che non può accedere e che stiamo usando un ORM come Entity Framework, per esempio.
Tuttavia, tutto quello che posso vedere succederà è che l'eccezione verrà visualizzata e mostrerà un brutto messaggio di errore all'utente.
Sono a conoscenza dell'attributo HandleError, ma ho capito che è principalmente utilizzato per reindirizzare a una pagina di errore se si verifica un'eccezione non gestita.
Naturalmente, questo codice potrebbe essere avvolto in un try-catch, ma non separa bene, soprattutto se si dispone di più logica:
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();
}
In precedenza ho estratto fuori tutto il codice che potrebbe generare eccezioni come chiamate di database in una classe DataProvider che gestisce gli errori e restituisce i messaggi per la visualizzazione dei messaggi all'utente.
Mi chiedevo quale sia il modo migliore per gestirlo? Non voglio sempre tornare a una pagina di errore perché alcune eccezioni non dovrebbero farlo. Invece, un messaggio di errore per l'utente dovrebbe essere visualizzato con una vista normale. Il mio metodo precedente era corretto o esiste una soluzione migliore?
Sono anche d'accordo con la risposta Patrick Desjardins': l'override OnException è un ottimo modo per gestire gli errori. Soprattutto se si trova in un controller di base ereditato da tutti gli altri controller. – NovaJoe