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