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