2011-06-11 16 views
15

Quiero controlar el error de toda la aplicación y mostrar una página ErrorView en asp.net mvc. Hay 3 formas de hacerlo (o lo sé).ErrorAttribute vs OnException vs Application_Error

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. 

¿Cuál es la mejor práctica. ¿Cuál de estos métodos se debe usar para el manejo de errores en toda la aplicación o deberíamos usar múltiples o solo uno?

Si manejamos el error en ErrorAttribute O/OnException() en BaseController aún debemos manejarlo en Application_Error().

¿Cuándo deberíamos usar Application_Error()?

Respuesta

9
  1. HandleErrorAttribute es un filtro de MVC aplicado a través del atributo. Puede proporcionar un nombre de vista para mostrar si se produce una excepción y también puede especificar el tipo de excepción base (o específico) al que se aplica este filtro. Si no se proporciona ningún nombre de vista, buscará una vista llamada "Error". Como ya habrás notado, puedes aplicarlo a varios ámbitos. Le permite especificar una vista diferente de "página de error" basada en la excepción.

  2. Controller.OnException es un método que recibirá una llamada si alguna de sus acciones termina arrojando un error.

  3. Los dos conceptos anteriores son conceptos MVC y parte de la tubería MVC, que se encuentra en la parte superior de la tubería ASP.NET, y si maneja la excepción utilizando lo anterior, no se propagará a Application_Error, pero las cosas como http errors 404, 500 y lo haré si no recuerdo mal.

¿Qué utilizar?

Definitivamente mirar en ELMAH para la aplicación de registro de error de ancho y mi blog post sobre ELMAH y ASP.NET MVC

En cuanto a las páginas de error que muestra que debe estar bien con sólo el uso de [HandleError] y la HandleErrorAttribute, puesto que ya se encarga de todo para usted (filtrado opcional y página de error personalizada opcional por tipo de excepción).

+0

Si tengo HandleErrorAttribute capturando la clase Exception, ¿eso no previene todas las "excepciones no controladas?" Si es así, ¿eso no le impide a Elmah trabajar? –

+0

Sí, lo hace, pero puede tener un filtro que se ejecute antes de todo lo que registra la excepción a través de Elmah, pero no lo controla ni lo suprime: http://stackoverflow.com/questions/766610/how-to-get-elmah- to-work-with-asp-net-mvc-handleerror-attribute/5936867 # 5936867 –

+0

Ese último párrafo tiene que estar equivocado, o estoy malinterpretando algo. Para mostrar páginas de error, ¿cómo está bien simplemente usar el 'HandleErrorAttribute'? ELMAH no hace nada para manejar el error, simplemente lo registra y con el 'HandleErrorAttribute' no se manejará ningún error que no sea 500 o que ocurra fuera del controlador. Entonces también necesitarías usar 'Application_Error'. –

0

si desea controlar el error en el nivel de aplicación, entonces no aplique el control de error HandleError o OnException para el controlador.

Intente obtener el último error del objeto del servidor en Application_Error Handler, compruebe el Tipo de excepción y, según el tipo de excepción, defina la acción que desea realizar.

Para 404 es posible que desee establecer una acción diferente en el controlador para manejar.

Para 500 es posible que desee establecer una acción diferente en el controlador para manejar.

Para NON HTTPException (SQLException) es posible que desee enviar un correo electrónico.

Asegúrese de establecer el Código de estado de respuesta correcto para fines de SEO.

Cuestiones relacionadas