2010-09-14 11 views
6

Tengo una excepción OnException (ExceptionContext filterContext) en mi controlador base para capturar la aplicación durante cualquier error y luego registrarla. El problema que tengo en mi aplicación es que este método en particular se activa cuatro veces para ciertos errores. Me voy a caminar a través de un escenario:Manejo correcto de errores en ASP.NET MVC2

Digamos que vaya a: http://localhost:180/someController/someAction?someId=XX

Y tengo mala manipulación en mi código objeto. El Id pasado es inválido, y recupera algún objeto nulo, entonces, a causa de mi manejo incorrecto de objetos, intento operar un objeto nulo. Obtengo una excepción

OnConception de BaseController se desactiva aquí.

Ese objeto nulo aún se devuelve a la vista, donde la vista intenta vincularlo a algo, o lo que sea.

OnConception de BaseController se activa nuevamente aquí, por el error en la vista.

Básicamente, solo un error es importante para mí, pero el efecto de goteo está provocando que se disparen más errores y envía spam a mi bandeja de entrada: - /.

¿Cuál es la forma correcta de detectar un error en MVC2 y que esto no me pase a mí?

Respuesta

0

Primero explicar por qué está recibiendo múltiples errores. El primer error será tratar de operar en un objeto nulo muy probablemente en su modelo o controlador. Probablemente obtenga una segunda excepción cuando la vista intente enlazarse con un objeto nulo cuando esté esperando la existencia de un objeto. No estoy seguro de por qué está recibiendo 4 errores, pero podría ser porque el código está tratando de operar en un objeto que actualmente es nulo.

Mi primera sugerencia sería hacer que su código OnException redirija la aplicación a una página de error amigable. Probablemente solo esté consumiendo cada nueva excepción y no permita que web.config maneje las páginas de error correctamente si tiene esa configuración para mostrar una página de error.

Mi segunda sugerencia sería agregar algún código para verificar la presencia de objetos nulos antes de operarlos. Estas son comúnmente llamadas cláusulas de Guardia, y son muy útiles y útiles para implementar. A continuación, puede determinar una forma agradable de manejar los errores sin tener que registrar siempre una excepción si no es necesario y también mostrar un mensaje amigable a un usuario además de un error genérico: "Ha ocurrido un error". mensaje.

Por ejemplo, en el controlador se puede comprobar de un objeto nulo y pasar una vista alternativa para el usuario si ese objeto es nulo

Function Example As ActionResult 

    dim obj as Object = GetObject 

    If obj is Nothing Then 

     Return View("FriendlyNoObjectView") 

    Else 

     Return View(obj) 

    End If 

End Function 

Sé que esto es vb (Lo siento, sé que mejor que C#) Pero la idea es la misma. Si lo desea, aún podría registrarlo como un error, pero luego evitaría que el error ocurra muchas veces. Siempre es una buena práctica manejar el error cuando ocurre y tratar de no dejarlo flotar hasta la parte superior de la pila y causar muchos otros errores.

Espero que esto ayude estos fueron solo mis pensamientos rápidos al leer su pregunta.

+0

Gracias por su rápida respuesta. Aclararé algo aquí ... Tengo protección sobre objetos nulos, solo quería dar un ejemplo de una excepción que sucede de la manera más fácil posible. Además, la página de error muestra como debería, eso tampoco es un problema. Es simplemente que cuando ocurre una excepción y se filtra para causar más excepciones, todos se conectan, cuando solo me importa la primera. Supongo que en el primer error, la aplicación detendría la ejecución, pero ese no parece ser el caso ... –

1

Yo recomendaría heredar del atributo HandleError y rodar su manejo de excepciones allí. Sobrescribir OnException en un solo controlador significa que tiene muchos códigos de manejo de excepciones en muchos controladores o hereda de uno básico, lo que debido a la interconexión de MVC no es realmente necesario en ninguno de los casos.

Al usar el atributo, debe tener una ocurrencia de un error por acción ejecutada, y una vez que se maneja el error, no volverá a activarse. Con suerte, esto reducirá los mensajes de repetición de excepciones.

Personalmente uso atributos para el manejo de excepciones porque es más limpio y más reutilizable y me libero de mucho ruido dentro de mis acciones.

+0

Esto es bueno, me gusta este enfoque, sin embargo, todavía encuentro el mismo problema con la solicitud que todavía intenta terminar el ejecución y borboteo hasta vistas parciales y vistas, creando errores en cada una de ellas. esta es la excepción que obtengo en las Vistas (la primera excepción, la que deseo registrar, ocurre en el controlador): Error al ejecutar la solicitud secundaria para el manejador 'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper'. –