Manejo de errores de ASP.NET MVC 5

Queremos manejar 403 errores, 404 errores, todos los errores debidos a MySpecialDomainException y proporcionar una página de error predeterminada para todos los demás errores (incluidos los errores en la configuración de IIS). Todos los errores deberían devolver vistas Razor correctas, sería muy bueno tener un ErrorController frente a las vistas. Por ejemplo, algo como esto:

 public class ErrorController : Controller { public ViewResult NotFound () { return View(); } public ViewResult Forbidden () { return View(); } public ViewResult Default () { var ex = ObtainExceptionFromSomewhere(); if(ex is MySpecialDomainException) return View("MySpecialDomainException", new ErrorModel { Exception = ex }); return View("GeneralError", new ErrorModel { Exception = ex }); } } 

Actualmente, usted encuentra muchas maneras diferentes de hacerlo en el www, algunas de las cuales probablemente estén desactualizadas. Entre esos:

  • Controller.OnException ()
  • Filtro de error
  • Elemento customErrors en web.config
  • Manejo de Application_Error de Global.asax

P1: ¿Cuál es la forma recomendada de cumplir nuestros requisitos con ASP.NET MVC 5?

También queremos detectar errores que ocurren en el host de IIS. P2: Para evitar que IIS tenga que manejar 404s, pensamos en agregar una ruta predeterminada que coincida con todas las posibles URL, ¿es recomendable? ¿Es mejor registrarse también para los 404 de IIS también?

Q3: ¿Es posible registrar una página de error de IIS que se remonta a un controlador, o es IIS capaz de ASPX / HTML estático solamente?

La mejor forma es utilizando Global.Asax, ya que puede administrar todo tipo de errores (llamadas Ajax / todos los errores inesperados). con otros no puedes hacerlo.

Me gusta esto:

 protected void Application_Error() { HttpContext httpContext = HttpContext.Current; if (httpContext != null) { RequestContext requestContext = ((MvcHandler)httpContext.CurrentHandler).RequestContext; /* When the request is ajax the system can automatically handle a mistake with a JSON response. Then overwrites the default response */ if (requestContext.HttpContext.Request.IsAjaxRequest()) { httpContext.Response.Clear(); string controllerName = requestContext.RouteData.GetRequiredString("controller"); IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory(); IController controller = factory.CreateController(requestContext, controllerName); ControllerContext controllerContext = new ControllerContext(requestContext, (ControllerBase)controller); JsonResult jsonResult = new JsonResult { Data = new { success = false, serverError = "500" }, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; jsonResult.ExecuteResult(controllerContext); httpContext.Response.End(); } else { httpContext.Response.Redirect("~/Error"); } } } 

No hay una solución dorada para todas las aplicaciones.

Puede mostrar una página de error amigable usando httpErrors en web.config. A diferencia de CustomErrors, esta es una configuración de nivel de IIS e incluso le mostrará una página de error amigable para errores que no son de ASP.NET.

Para el registro de errores, recomiendo ir con un HttpModule como ELMAH: https://code.google.com/p/elmah/

Escribí una publicación de blog completa sobre esto y en la que explico las diferentes formas de manejo de errores: http://dusted.codes/demystifying-aspnet-mvc-5-error-pages-and-error-logging

Una mejor forma de manejar el error es extender el atributo handleerror. El atributo de error de control tiene las siguientes ventajas

  • Con HandleErrorAttribute tenemos más control sobre el manejo de excepciones. HandleError nos permite manejar el error de manera diferente para diferentes controladores y acciones fácilmente, donde en Application_Error para obtener esta característica, tomamos la ayuda de switch loop.

  • Una vez que te encuentras en Application_Error estás fuera de MVC y perderás ControllerContext y luego no podremos hacer muchas cosas que serán fácilmente posibles con HandleError.

consulte la siguiente publicación sobre cómo extender el atributo y las ventajas del manejo de errores

Ventajas de [HandleError] sobre Application_Error

http://maheshde.blogspot.com.au/2012/09/error-handing-with-mvc-using-custom.html

http://www.codeproject.com/Articles/731913/Exception-Handling-in-MVC