MVC Framework - obsługa wyjątków
W ASP.NET obsługa błędów odbywa się przy użyciu standardowej metody try catch lub zdarzeń aplikacji. ASP.NET MVC ma wbudowaną obsługę obsługi wyjątków przy użyciu funkcji znanej jako filtry wyjątków. Nauczymy się tutaj dwóch podejść: jedno z przesłonięciem metody onException, a drugie przez zdefiniowanie filtrów HandleError.
Zastąp metodę OnException
To podejście jest używane, gdy chcemy obsłużyć wszystkie wyjątki w metodach Action na poziomie kontrolera.
Aby zrozumieć to podejście, utwórz aplikację MVC (wykonaj czynności opisane w poprzednich rozdziałach). Teraz dodaj nową klasę Controller i dodaj następujący kod, który przesłania metodę onException i jawnie zgłosi błąd w naszej metodzie Action -
Teraz stwórzmy wspólny widok o nazwie Errorktóry będzie wyświetlany użytkownikowi, gdy w aplikacji wystąpi jakikolwiek wyjątek. W folderze Views utwórz nowy folder o nazwie Shared i dodaj nowy widok o nazwie Error.
Skopiuj następujący kod do nowo utworzonego Error.cshtml -
Jeśli spróbujesz teraz uruchomić aplikację, da to następujący wynik. Powyższy kod renderuje widok błędu, gdy wystąpi jakikolwiek wyjątek w którejkolwiek z metod akcji w tym kontrolerze.
Zaletą tego podejścia jest to, że wiele akcji w ramach tego samego kontrolera może współdzielić tę logikę obsługi błędów. Jednak wadą jest to, że nie możemy używać tej samej logiki obsługi błędów na wielu kontrolerach.
Atrybut HandleError
Atrybut HandleError jest jednym z filtrów akcji, które omówiliśmy w rozdziale Filtry i filtry akcji. HandleErrorAttribute jest domyślną implementacją IExceptionFilter. Ten filtr obsługuje wszystkie wyjątki zgłoszone przez akcje kontrolera, filtry i widoki.
Aby skorzystać z tej funkcji, najpierw włącz sekcję customErrors w pliku web.config. Otwórz plik web.config i umieść następujący kod w pliku system.web i ustaw jego wartość na On.
<customErrors mode = "On"/>
Mamy już widok błędu utworzony w folderze udostępnionym w obszarze widoki. Tym razem zmień kod tego pliku widoku na następujący, aby silnie wpisać go za pomocą modelu HandleErrorInfo (który jest obecny w System.Web.MVC).
@model System.Web.Mvc.HandleErrorInfo
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name = "viewport" content = "width = device-width" />
<title>Error</title>
</head>
<body>
<h2>
Sorry, an error occurred while processing your request.
</h2>
<h2>Exception details</h2>
<p>
Controller: @Model.ControllerName <br>
Action: @Model.ActionName
Exception: @Model.Exception
</p>
</body>
</html>
Teraz umieść następujący kod w pliku kontrolera, który określa atrybut [HandleError] w pliku kontrolera.
using System;
using System.Data.Common;
using System.Web.Mvc;
namespace ExceptionHandlingMVC.Controllers {
[HandleError]
public class ExceptionHandlingController : Controller {
public ActionResult TestMethod() {
throw new Exception("Test Exception");
return View();
}
}
}
Jeśli spróbujesz teraz uruchomić aplikację, pojawi się błąd podobny do pokazanego na poniższym zrzucie ekranu.
Jak widać, tym razem błąd zawiera więcej informacji o kontrolerze i szczegółach związanych z akcją. W ten sposób HandleError może być używany na dowolnym poziomie i między kontrolerami do obsługi takich błędów.