MVC Framework - обработка исключений
В ASP.NET обработка ошибок выполняется с использованием стандартного подхода try catch или с использованием событий приложения. ASP.NET MVC имеет встроенную поддержку обработки исключений с помощью функции, известной как фильтры исключений. Здесь мы собираемся изучить два подхода: один с переопределением метода onException, а другой путем определения фильтров HandleError.
Переопределить метод OnException
Этот подход используется, когда мы хотим обрабатывать все исключения в методах действия на уровне контроллера.
Чтобы понять этот подход, создайте приложение MVC (выполните действия, описанные в предыдущих главах). Теперь добавьте новый класс контроллера и следующий код, который переопределяет метод onException и явно выдает ошибку в нашем методе Action:
Теперь давайте создадим общий вид с именем Errorкоторый будет показан пользователю, когда в приложении произойдет какое-либо исключение. Внутри папки Views создайте новую папку с именем Shared и добавьте новый View с именем Error.
Скопируйте следующий код во вновь созданный Error.cshtml -
Если вы сейчас попытаетесь запустить приложение, оно выдаст следующий результат. Приведенный выше код отображает представление ошибок при возникновении исключения в любом из методов действия в этом контроллере.
Преимущество этого подхода в том, что несколько действий в одном контроллере могут совместно использовать эту логику обработки ошибок. Однако недостатком является то, что мы не можем использовать одну и ту же логику обработки ошибок для нескольких контроллеров.
Атрибут HandleError
Атрибут HandleError - это один из фильтров действий, который мы изучили в главе «Фильтры и фильтры действий». Атрибут HandleErrorAttribute - это реализация IExceptionFilter по умолчанию. Этот фильтр обрабатывает все исключения, вызванные действиями контроллера, фильтрами и представлениями.
Чтобы использовать эту функцию, прежде всего включите раздел customErrors в web.config. Откройте web.config, поместите следующий код в system.web и установите для него значение On.
<customErrors mode = "On"/>
У нас уже есть представление ошибок, созданное внутри общей папки в разделе Views. На этот раз измените код этого файла представления на следующий, чтобы строго напечатать его с помощью модели HandleErrorInfo (которая присутствует в 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>
Теперь поместите следующий код в файл контроллера, который указывает атрибут [HandleError] в файле контроллера.
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();
}
}
}
Если вы попытаетесь запустить приложение сейчас, вы получите сообщение об ошибке, подобное показанному на следующем снимке экрана.
Как видите, на этот раз ошибка содержит дополнительную информацию о деталях, связанных с контроллером и действием. Таким образом, HandleError может использоваться на любом уровне и между контроллерами для обработки таких ошибок.