ErrorAttribute vs OnException vs Application_Error
Я хочу обработать ошибки приложения и показать страницу 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 Or/ и OnException() в BaseController, мы все равно должны обработать ее в Application_Error().
Когда мы должны использовать Application_Error()?
2 ответа
HandleErrorAttribute
фильтр MVC, применяемый через атрибут Вы можете указать имя представления для отображения в случае возникновения исключения, а также указать базовый (или конкретный) тип исключения, к которому применяется этот фильтр. Если имя представления не указано, оно будет искать представление с именем "Ошибка". Как вы уже заметили, вы можете применить его к различным областям применения. Это позволяет вам указать другое представление "страницы ошибок" на основе исключения.Controller.OnException
это метод, который будет вызван, если любое из ваших действий приведет к ошибке.Оба из двух вышеперечисленных являются концепциями MVC и являются частью конвейера MVC, который расположен поверх конвейера ASP.NET, и если вы обрабатываете исключение с помощью вышеупомянутого, он не будет распространяться на
Application_Error
, но такие вещи, как http ошибки 404, 500 и будет, если я правильно помню.
Что использовать?
Обязательно загляните в ELMAH для регистрации ошибок всего приложения и в моем блоге об ELMAH и ASP.NET MVC
Что касается отображения страниц с ошибками, вы должны быть в порядке, просто используя [HandleError]
и HandleErrorAttribute
, поскольку он уже обрабатывает все для вас (необязательная фильтрация и необязательная настраиваемая страница ошибок для каждого типа исключения).
Если вы хотите обработать ошибку на уровне приложения, не применяйте переопределение HandleError или OnException для контроллера.
Попробуйте получить последнюю ошибку из объекта сервера в обработчике Application_Error, проверьте тип исключения и на основе типа исключения определите действие, которое вы хотели бы выполнить.
Для 404 вы можете захотеть установить другое действие на контроллере для обработки.
Для 500 вы можете захотеть установить другое действие на контроллере для обработки.
Для NON HTTPException (SQLException) вы можете даже отправить электронное письмо.
Пожалуйста, убедитесь, что вы установили правильный код статуса ответа для целей SEO.