2011-05-13 30 views
33

¿Existe una forma integrada o adecuada para manejar los errores en asp.net mvc 3?Manejo de errores en asp.net mvc 3

Esto es lo que quiero hacer:

  1. Si la aplicación se bloquea o genera un error, se va a una página de error específico.
  2. Puedo lanzar mi propio error desde la acción del controlador. (y va a una página de error).

He encontrado las siguientes maneras:

  1. Veo que hay un largo camino para hacerlo here. (para v1 y v2 pero también se aplica a v3).
  2. Uso del atributo de control de errores here.

¿Cómo manejo esto de la manera correcta?

Si la solución es similar o es como # 1 en la lista anterior, estoy usando ninject y no he creado una clase base. ¿Cómo sigo haciendo esto?

Respuesta

13

Para Global Error Handling
Todo lo que tiene que hacer es cambiar el modo customErrors = "Sí" en la página web.config se mostrará
de error a través Error.cshtml reside en la carpeta compartida.

Asegúrese de que Error.cshtml diseño no es nulo.
[Sería algo así como: @ {Diseño = "~/Views/Shared/_Layout.cshtml";
} O eliminar Disposición = bloque de código nulo] marcado
una muestra para Error.cshtml: -

@{ Layout = "~/Views/Shared/_Layout.cshtml"; } 

@model System.Web.Mvc.HandleErrorInfo 

<!DOCTYPE html> 
<html> 
<head> 
    <title>Error</title> 
</head> 
<body> 
    <h2> 
     Sorry, an error occurred while processing your request. 
    </h2> 
    <p>Controller Name: @Model.ControllerName</p> 
    <p>Action Name : @Model.ActionName</p> 
    <p>Message: @Model.Exception.Message</p> 
</body> 
</html> 

Por error específico de manipulación
Añadir atributo HandleError a la acción específica en la clase controlador. Proporcione 'Ver' y 'ExceptionType' para ese error específico.
Una muestra NotImplemented manejador de excepción:

public class MyController: Controller 
    { 
     [HandleError(View = "NotImplErrorView", ExceptionType=typeof(NotImplementedException))] 
     public ActionResult Index() 
     { 
      throw new NotImplementedException("This method is not implemented."); 
      return View(); 
     } 
} 
15

Sugeriría implementar un filtro de acción HandleErrorAttribute personalizado.

Vea este enlace para más detalles:
http://msdn.microsoft.com/en-us/library/dd410203%28v=vs.90%29.aspx

Configuración de un filtro de acción HandleErrorAttribute le da un control completo sobre qué acciones son manejados por el filtro, y es fácil de configurar a nivel del controlador, o incluso en el nivel del sitio configurándolo en un controlador base personalizado y teniendo todos sus controladores heredados del controlador base.

Algo más que hago con esto, es que tengo una HandleJsonErrorAttribute separada que responde a las llamadas Ajax devolviendo una respuesta Json, en lugar de la página personalizada.

ACTUALIZACIÓN:

por algunas preguntas a continuación, aquí es un ejemplo de un HandleJsonErrorAttribute que utilizo:

public class HandleJsonErrorAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     var serviceException = filterContext.Exception as ServiceException; 

     filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; 

     filterContext.Result = new JsonResult { Data = new { message = serviceException == null ? "There was a problem with that request." : serviceException.Message } }; 

     filterContext.ExceptionHandled = true; 
    } 
} 

Y aquí es el jQuery que utilizo para manejar estas excepciones unhanded:

$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) { 
    showPopdown($.parseJSON(jqXHR.responseText).message); 
}); 

Esto permite que mis métodos Ajax sean muy livianos, solo manejan el retorno normal de Json, y en el caso de una excepción sin manos, un mensaje con un código de estado de error se envuelve en Json y se devuelve.

Además, en mi implementación, tengo un ServiceException personalizado que arrojo de los servicios, y esto envía el mensaje de la capa de servicio en lugar de un mensaje genérico.

+0

Podría dar un ejemplo de cómo habría que manejar estas llamadas error de Ajax por el uso de 'HandleJsonErrorAttribute'? – AdrianoRR

+0

Sí, también estoy interesado en HandleJsonErrorAttribute. ¿Me puede dar más información y/o un ejemplo? –

+0

¡Buen código! Esto funciona para mi. ¡Gracias! Solo cambié StatusCode a "Ok" y manejo la excepción en mi propio código. Para cualquiera que esté buscando cómo usar: simplemente ponga el atributo en Acción (como: [HandleJsonErrorAttribute] public JsonResult ActionNameX (object someArgs) {...} –

2

Creo que la forma más fácil es usar el atributo ExceptionHandler ya está listo para usar en cualquier momento se crea un nuevo proyecto de ASP.NET MVC 3. Todavía puede configurar Web.config para usar una página de error personalizada y manejar excepciones en el método Global Application_Error como de costumbre, pero cuando ocurre una excepción, la URL no se muestra tan bien como el nuevo MVC 3.

+1

El nombre exacto del atributo es HandleError. –