Wenn eine Ausnahme von Ihrem eigenen Code ausgelöst wird, der von einer Aktion in einem Controller aufgerufen wird, wie soll das gehandhabt werden? Ich sehe viele Beispiele für Best Practices, in denen es überhaupt keine Try-Catch-Statements gibt. Zum Beispiel den Zugriff auf Daten aus einem Repository:Ausnahmebehandlung in Controller (ASP.NET MVC)
public ViewResult Index()
{
IList<CustomModel> customModels = _customModelRepository.GetAll();
return View(customModels);
}
Offensichtlich dieser Code eine Ausnahme auslösen könnte, wenn der Anruf zu einer Datenbank, die nicht darauf zugreifen können, und wir werden mit Hilfe eines ORM wie Entity Framework zum Beispiel.
Allerdings wird alles, was ich sehen kann, passieren, dass die Ausnahme platzt und dem Benutzer eine unangenehme Fehlermeldung anzeigt.
Ich kenne das HandleError-Attribut, aber ich verstehe, dass es meistens verwendet wird, um Sie auf eine Fehlerseite umzuleiten, wenn eine nicht behandelte Ausnahme auftritt.
Natürlich könnte dieser Code in einem Try-Catch gewickelt werden, sondern trennt sich nicht gut, vor allem, wenn Sie mehr Logik:
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();
}
Bisher habe ich alle Code extrahiert aus, die wie werfen könnten Ausnahmen Die Datenbank ruft eine DataProvider-Klasse auf, die Fehler verarbeitet und Nachrichten zurückgibt, um dem Benutzer Nachrichten anzuzeigen.
Ich fragte mich, was ist der beste Weg, dies zu handhaben? Ich möchte nicht immer zu einer Fehlerseite zurückkehren, da einige Ausnahmen dies nicht tun sollten. Stattdessen sollte eine Fehlermeldung für den Benutzer mit einer normalen Ansicht angezeigt werden. War meine bisherige Methode korrekt oder gibt es eine bessere Lösung?
ich mit Patrick Desjardins' Antwort auch einig: zwingende OnException ist eine gute Möglichkeit, um Fehler zu behandeln. Vor allem, wenn es sich um einen Basiscontroller handelt, von dem alle anderen Controller geerbt werden. – NovaJoe