ErrorAttribute vs OnException vs Application_Error - PullRequest
16 голосов
/ 11 июня 2011

Я хочу обработать ошибки приложения и показать страницу ErrorView в asp.net mvc.Есть 3 способа сделать это (или я знаю).

1) ErrorAttribute in BaseController:Controller class.
     Can be used on individual Action/Controller/BaseController.
2) Override OnException() in the BaseController:Controller class.
     Will work on Controllers derived from BaseController
3) Application_Error in Global_aspx.

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

Если мы обрабатываем ошибку в ErrorAttribute или / и OnException () в BaseController, мы все равно должны обрабатывать ее в Application_Error ().

Когда мы должны использовать Application_Error ()?

Ответы [ 2 ]

11 голосов
/ 12 июня 2011
  1. HandleErrorAttribute - фильтр MVC, применяемый через атрибут. Вы можете указать имя представления для отображения в случае возникновения исключения, а также указать базовый (или конкретный) тип исключения, к которому применяется этот фильтр. Если имя представления не указано, оно будет искать представление с именем «Ошибка». Как вы уже заметили, вы можете применить его к различным областям применения. Это позволяет вам указать другое представление "страницы ошибок" на основе исключения.

  2. Controller.OnException - это метод, который будет вызываться, если любое из ваших действий приведет к ошибке.

  3. Оба из вышеупомянутых двух являются понятиями MVC и являются частью конвейера MVC, который расположен поверх конвейера ASP.NET, и если вы обрабатываете исключение с помощью вышеупомянутого, он не будет распространяться на Application_Error , но такие вещи, как ошибки http 404, 500 и будет, если я правильно помню.

Что использовать?

Обязательно загляните в ELMAH для регистрации ошибок приложений и моего сообщения в блоге об ELMAH и ASP.NET MVC

Что касается отображения страниц с ошибками, вам будет достаточно просто использовать [HandleError] и HandleErrorAttribute, поскольку он уже обрабатывает все для вас (дополнительная фильтрация и дополнительная настраиваемая страница ошибок для каждого типа исключения).

0 голосов
/ 12 июня 2011

, если вы хотите обработать ошибку на уровне приложения, не применяйте HandleError или OnException Override для контроллера.

Попытайтесь получить последнюю ошибку от объекта сервера в Application_Error. Обработчик проверяет тип исключения и на основе типа исключения определяет действие, которое вы хотели бы выполнить.

Для 404 вы можете установить другое действие на контроллере для обработки.

Для 500 вы можете установить другое действие на контроллере для обработки.

Для NON HTTPException (SQLException) вы, возможно, даже захотите отправить электронное письмо.

Пожалуйста, убедитесь, что вы установили правильный код статуса ответа для целей SEO.

...