2010-01-14 15 views
8

Necesito redirigir globalmente a mis usuarios si se produce un error personalizado en mi aplicación. He intentado poner algo de lógica en mi archivo global.asax para buscar mi error personalizado y, si se lanza, realizar un redireccionamiento, pero mi aplicación nunca llega a mi método global.asax. Me sigue dando un error que dice que mi excepción no fue controlada por el código de usuario.Redirigir asp.net mvc si se produce una excepción personalizada

esto es lo que tengo en mi global.

protected void Application_Error(object sender, EventArgs e) 
{ 
    if (HttpContext.Current != null) 
    { 
     Exception ex = HttpContext.Current.Server.GetLastError(); 
     if (ex is MyCustomException) 
     { 
      // do stuff 
     } 
    } 
} 

y mi excepción se produce de la siguiente manera:

if(false) 
    throw new MyCustomException("Test from here"); 

cuando pongo eso en un intento de captura dentro del archivo de lanzar la excepción, mi método Application_Error nunca se alcanza. Alguien tiene algunas sugerencias sobre cómo puedo manejar esto globalmente (¿lidiar con mi excepción personalizada)?

gracias.

1/15/2010 edición: Esto es lo que está en // hacer cosas.

RequestContext rc = new RequestContext(filterContext.HttpContext, filterContext.RouteData); 
string url = RouteTable.Routes.GetVirtualPath(rc, new RouteValueDictionary(new { Controller = "Home", action = "Index" })).VirtualPath; 
filterContext.HttpContext.Response.Redirect(url, true); 
+0

+1 para las cosas doblan el bit – stuartdotnet

Respuesta

10

Desea crear un filtro de cliente para sus controladores/acciones. Tendrá que heredar de FilterAttribute y IExceptionFilter.

Algo como esto:

public class CustomExceptionFilter : FilterAttribute, IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     if (filterContext.Exception.GetType() == typeof(MyCustomException)) 
     { 
      //Do stuff 
      //You'll probably want to change the 
      //value of 'filterContext.Result' 
      filterContext.ExceptionHandled = true; 
     } 
    } 
} 

Una vez que haya creado, a continuación, puede aplicar el atributo a un BaseController que todos sus otros controladores heredan de hacer que la funcionalidad sitio de ancho.

Estos dos artículos podrían ayudar:

+0

bien Voy a intentarlo. para fines de prueba, si quisiera agregarlo a uno de mis controladores directamente, ¿cómo haré para eso? Perdón por la novedad:/ – Kyle

+0

Traté de agregar el atributo "[CustomExceptionFilter]" A la parte superior de mi clase de controlador y luego lanzando una excepción y no parece estar obteniendo capturado por este filtro. No está arrojando el mismo error que antes, pero no está golpeando mi filtro de excepción personalizado. También traté de ponerlo en el método de acción que estoy atacando, que debería arrojar la excepción, y tampoco funciona allí ... ¿alguna idea? – Kyle

+0

arañar mi último comentario, había olvidado volver a colocar mi tirador. Cuando lo hice, recibo el mismo error que antes "mi excepción no fue controlada por el código de usuario". ¿Lo necesito en una captura de prueba? – Kyle

Cuestiones relacionadas