Книга: ASP.NET MVC Framework
HandleErrorAttibute
HandleErrorAttibute
Атрибут HandleErrorAttribute
предназначен для того, чтобы однообразно сформировать механизм обработки необработанных в контроллерах исключений. Атрибут HandleErrorAttribute
применим как к классу контроллера, так и к любому действию. Кроме того, допустимо указывать атрибут несколько раз. По умолчанию, без параметров, механизм MVC с помощью атрибута HandleErrorAttribute
при возникновении исключения произведет переадресацию на представление Error, которое должно находиться в папке -/Views/Shared. Однако это действие можно изменить под свои потребности. Для манипулирования порядком действия атрибута HandleErrorAttribute
у него есть ряд параметров:
? ExceptionType
— указывает тип исключения, на возникновение которого должен реагировать данный атрибут;
? View
— указывает представление, которое нужно показать пользователю при срабатывании атрибута;
? Master
— указывает наименование Master View, которое будет использоваться при демонстрации пользователю представления;
? Order
— указывает на последовательный номер, в порядке которого атрибут будет исполняться.
Для демонстрации работы атрибута HandleErrorAttribute
создадим представление AdminError
, которое будет использоваться только тогда, когда произойдет ошибка при работе с контроллером AdminController
. В листинге 4.3 представлен код представления.
<%@ Page Title="" Language="C#"
MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ContentPlaceHolderID="TitleContent"
runat="server">
Ошибка! Произошло необработанное исключение.
</asp:Content>
<asp:Content ContentPlaceHolderID="MainContent"
runat="server">
<% var model = (HandleErrorlnfo)ViewData.Model; %>
<h2>Внимание</h2>
<р>При работе сайта произошла исключительная
ситуация в действии <%= model.ActionName %>
контроллера <%= model.ControllerName %>.
Ниже представлена дополнительная информация об исключении:
</p>
<p><%= model.Exception.Message %></p>
<p><%= model.Exception.StackTrace %></p>
</asp:Content>
Обратите внимание, для получения доступа к расширенной информации об исключении мы используем свойство Model
объекта ViewData
, предварительно приведя его к типу HandleErrorInfo
. Механизм атрибута HandleErrorAttribute
создает для представления элемент типа HandleErrorInfo
, объект которого содержит следующие данные:
? ActionName
— имя действия, в котором произошло исключение;
? ControllerName
— имя контроллера, в котором произошло исключение;
? Exception
- объект типа Exception, в котором содержится вся информация об исключении, в том числе строка сообщения и трассировка стека.
Для того чтобы проверить наше представление, создадим для тестирования новое действие TestException
в контроллере AdminController
:
public ActionResult TestException()
{
throw new Exception("Проверка исключения");
}
Пометим наш контроллер AdminController
атрибутом HandleErrorAttribute
в следующем виде, как это показано во фрагменте:
[HandleError(View = "AdminError")]
public class AdminController : Controller
Теперь, чтобы механизм атрибута HandleErrorAttribute
заработал, необходимо включить механизм Custom Errors в файле web.config так, как показано во фрагменте:
<customErrors mode="On" />
После запуска приложения и попытки доступа к действию TestException
мы получим сообщение об ошибке (рис. 4.8).
Кроме перечисленного, атрибут HandleErrorAttribute
имеет ряд важных особенностей:
? если механизм Custom Errors запрещен, или исключение уже было обработано другим атрибутом, то исполнение атрибута прекращается;
? если исключение является HTTP-исключением с кодом, отличным от 500, исполнение атрибута прекращается. Другими словами, этот атрибут не обрабатывает HTTP-исключения с любыми кодами ошибок, кроме 500;
? атрибут устанавливает Response.TrySkipIisCustomErrors = true
для того, чтобы попытаться переопределить страницы веб-сервера, настроенные для отображения ошибок;
? атрибут устанавливает код HTTP-ответа в значение 500, которое сообщает клиенту о возникшей при запросе ошибке.
Использование атрибута HandleErrorAttribte
позволяет гибко настраивать реакцию вашего приложения на возникновение исключительных ситуаций.
Вы можете определять для каждого контроллера, действия или типа исключения свои представления вывода информации об ошибке.