2009-08-31 14 views
7
error global

Digamos que poner el siguiente código en algún lugar de una página maestra en mi sitio ASP.NET MVC:manejo (fuera de control) en ASP.NET MVC

throw new ApplicationException("TEST"); 

Incluso con un atributo [HandleError] colocado en mi controlador, esta excepción todavía burbujea. ¿Cómo puedo lidiar con errores como este? Me gustaría poder enrutar a una página de Error y aún así poder registrar los detalles de la excepción.

¿Cuál es la mejor manera de lidiar con algo como esto?

Editar: Una solución que estaba considerando sería agregar un controlador nuevo: UnhandledErrorController. ¿Puedo poner un método Application_Error en Global.asax y luego redireccionar a este controlador (donde decide qué hacer con la excepción)?

Nota: la opción defaultRedirect en el elemento customErrors web.config no transfiere la información de la excepción.

+1

ApplicationException es en realidad un anti-práctica hoy en día, por favor ver: http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx Considera lanzar solo nuevo Excep ción (...); – Stephanvs

Respuesta

5

Como MVC está construido sobre asp.net, debe poder definir una página de error global en web.config, tal como podría hacerlo en formularios web, p. Ej.

<customErrors mode="On" defaultRedirect="~/ErrorHandler" /> 
+7

Entonces, ¿cómo recuperaría los detalles de la excepción? – user10789

1

En cuanto a lo de página para mostrar, que necesita para crear un customErrors section en su web.config y configurarlo para cualquier estado de códigos que desea manejar.

Ejemplo:

<customErrors defaultRedirect="GenericError.htm" mode="RemoteOnly"> 
    <error statusCode="500" redirect="InternalError.htm"/> 
</customErrors> 

En cuanto a las excepciones de registro, recomendaría el uso de ELMAH. Se integra muy bien con los sitios ASP.NET MVC.

+0

Sí, HandleError no hará nada a menos que tenga customErrors en la configuración. – swilliams

+0

Aún necesito poder recuperar y registrar los detalles de la excepción. Preferiblemente, podría hacer esto en la acción del controlador a la que apunta el valor predeterminado de Redirección. – user10789

+0

@iguananet Eso es lo que hace ELMAH. Si quieres hacerlo por separado, esa es una cuestión completamente diferente, pero funciona muy bien. Recomiendo mucho intentarlo. – Joseph

5

Se puede crear un filtro que busca una excepción en el método OnActionExecuted:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public class WatchExceptionAttribute : ActionFilterAttribute { 
    public override void OnActionExecuted(ActionExecutedContext filterContext) { 
    if (filterContext.Exception != null) { 
     // do your thing here. 
    } 
    } 
} 

entonces usted puede poner [WatchException] en un controlador o de un método de acción, y que le permitirá conectarse excepciones. Si tiene muchos Controladores, eso puede ser tedioso, por lo que si tiene un Controlador de Base común, puede anular OnActionExecuted allí y hacer lo mismo. Prefiero el método de filtro.

10

Habilitar customErrors:

<customErrors mode="On" defaultRedirect="~/Error"> 
    <error statusCode="401" redirect="~/Error/Unauthorized" /> 
    <error statusCode="404" redirect="~/Error/NotFound" /> 
</customErrors> 

y redirigir a un controlador de error personalizado:

[HandleError] 
public class ErrorController : BaseController 
{ 
    public ErrorController() 
    { 
    } 

    public ActionResult Index() 
    { 
     Response.StatusCode = (int)HttpStatusCode.InternalServerError; 
     return View ("Error"); 
    } 

    public ActionResult Unauthorized() 
    { 
     Response.StatusCode = (int)HttpStatusCode.Unauthorized; 
     return View ("Error401"); 
    } 

    public ActionResult NotFound() 
    { 
     string url = GetStaticRoute (Request.QueryString["aspxerrorpath"] ?? Request.Path); 
     if (!string.IsNullOrEmpty (url)) 
     { 
      Notify ("Due to a new web site design the page you were looking for no longer exists.", false); 
      return new MovedPermanentlyResult (url); 
     } 

     Response.StatusCode = (int)HttpStatusCode.NotFound; 
     return View ("Error404"); 
    } 
} 
+0

¿En qué parte del webconfig necesito poner los errores personalizados? – Zapnologica

Cuestiones relacionadas