c# - page - onexception mvc
ASP.NET MVC Controller.OnException no se llama (5)
La documentación de MSDN ( http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.onexception.aspx ) indica que el método OnException se "invoca cuando se produce una excepción no controlada en la acción".
Entonces, parece que solo se activará cuando ocurra una excepción no controlada en un método de acción.
Creé un nuevo controlador con una acción de índice. Y el método OnException, de hecho, se ejecuta. También intenté lanzar una excepción SystemException () y el método OnException también.
public ActionResult Index ( )
{
throw new NotImplementedException ( );
}
Tengo una clase de controlador base en la que reemplazo el método del controlador Controller.OnException para proporcionar un manejo de error genérico para ciertos tipos de controladores que heredarán de esta clase (estos son controladores de API que devolverán los resultados de JSON). El método OnException nunca se llama cuando el controlador genera una excepción. ¿Alguien ve lo que estoy haciendo mal, o hay una mejor manera de manejar esta situación?
Usando MVC 1.0
Clase base:
public class APIController : Controller
{
protected override void OnException(ExceptionContext filterContext)
{
//This is never called
filterContext.Result =
new JsonResult();
base.OnException(filterContext);
}
}
Clase heredera:
public class MyController : APIController
{
public AjaxResult ForcedException()
{
throw new SystemException();
}
}
¿Está llamando a la acción del controlador desde una prueba unitaria, o mediante ASP.NET? Si está llamando al método directamente en una prueba, digamos a través de NUnit, entonces OnException no se activará: el marco de prueba manejará la excepción y la convertirá en una prueba fallida.
Estaba teniendo exactamente el mismo problema en mi proyecto ASP.NET MVC 3.
Resulta que esta es una característica de Visual Studio y el servidor de desarrollo. Cuando se encuentre en modo de depuración, se lo devolverá a Visual Studio y se le asignará el cuadro de diálogo de excepción predeterminado.
Una forma de evitar que esto suceda es cambiar el modo de compilación en su Web.config
partir de esto:
<compilation debug="true" targetFramework="4.0">
A esto:
<compilation debug="false" targetFramework="4.0">
También puede dejar el modo de depuración configurado en verdadero, pero pruebe que su aplicación está funcionando seleccionando la Start without debugging option
del menú del estudio visual (invocado al presionar Ctrl+F5
.
Si entiendo su pregunta correctamente, su excepción debe marcarse como "manejada" en su OnException. Prueba esto:
filterContext.ExceptionHandled = true;
Aplica el atributo [HandleError]
a la clase.