Учебники

MVC Framework — обработка исключений

В ASP.NET обработка ошибок выполняется с использованием стандартного подхода try catch или с использованием событий приложения. ASP.NET MVC поставляется со встроенной поддержкой обработки исключений с использованием функции, известной как фильтры исключений. Мы собираемся изучить два подхода здесь: один с переопределением метода onException и другой путем определения фильтров HandleError.

Переопределить метод OnException

Этот подход используется, когда мы хотим обработать все исключения в методах Action на уровне контроллера.

Чтобы понять этот подход, создайте приложение MVC (выполните шаги, описанные в предыдущих главах). Теперь добавьте новый класс Controller и добавьте следующий код, который переопределяет метод onException и явно вызывает ошибку в нашем методе Action —

Обработка исключений MVC

Теперь давайте создадим общий вид с именем Error, который будет показан пользователю при возникновении любого исключения в приложении. Внутри папки Views создайте новую папку с именем Shared и добавьте новый View с именем Error.

Обработка ошибок MVC

Скопируйте следующий код внутри вновь созданного Error.cshtml —

MVC Exception Common View

Если вы попытаетесь запустить приложение сейчас, оно даст следующий результат. Приведенный выше код отображает окно «Просмотр ошибок», когда возникает какое-либо исключение в любом из методов действия в этом контроллере.

Обработка исключений MVC

Преимущество этого подхода состоит в том, что несколько действий в одном контроллере могут совместно использовать эту логику обработки ошибок. Однако недостатком является то, что мы не можем использовать одну и ту же логику обработки ошибок на нескольких контроллерах.

Атрибут 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(); 
      } 
   } 
}

Если вы попытаетесь запустить приложение сейчас, вы получите ошибку, аналогичную показанной на следующем снимке экрана.

Исключение MVC

Как видите, на этот раз ошибка содержит больше информации о контроллере и деталях, связанных с действием. Таким образом, HandleError может использоваться на любом уровне и между контроллерами для обработки таких ошибок.