Pregunta

En dos aplicaciones diferentes, una personalizada, la otra aplicación MVC de muestra que se obtiene con un nuevo proyecto MVC VS2008, [HandleError] no está capturando excepciones.

En la aplicación de muestra tengo:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";
        throw new Exception();
        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}

que es solo el controlador predeterminado con una excepción lanzada para la prueba.

Pero no funciona. En lugar de ir a la página predeterminada error.aspx, muestra la información de depuración en el navegador.

El problema surgió por primera vez en una aplicación personalizada en la que estoy trabajando que me llevó a probarlo con la aplicación de muestra. Pensando que tenía algo que ver con los cambios que hice en la aplicación personalizada, dejé la aplicación de muestra completamente sin cambios con la excepción (yuck) del lanzamiento en el método de índice.

Estoy perplejo. ¿Qué me estoy perdiendo?

¿Fue útil?

Solución

En Web.config, cambie customErrors:

<system.web>
  <customErrors mode="On">
  </customErrors>

Si el modo es Off o RemoteOnly, verá la pantalla amarilla de la muerte en lugar de la página de error personalizada. El razonamiento es que los desarrolladores generalmente quieren la información más detallada en la pantalla amarilla de la muerte.

Otros consejos

Importante: ¡Tenga cuidado de que su página de error en sí no tenga un error!

Si lo hace, terminará con esa página de error personalizada de ASP.NET y terminará dando vueltas en círculos y arrancándose el pelo. Simplemente elimine todo lo que pueda causar un error de la página y pruébelo.

También con respecto a que 'customErrors' esté ENCENDIDO o APAGADO, hay varios factores que contribuyen a si la página de error amigable (su Error.aspx) se mostrará o no.

Ver este blog (excepto a continuación)

  

HttpContext.IsCustomErrorEnabled: analiza tres fuentes diferentes

     
      
  1. El web.config's < implementación > propiedad comercial de la sección. Esto es un   propiedad útil para establecer al implementar   su aplicación a una producción   servidor. Esto anula cualquier otro   configuraciones para errores personalizados.
  2.   
  3. El web.config's < customErrors > propiedad de modo de sección. Esta configuración   indica si los errores personalizados son   habilitado en absoluto, y si es así si   están habilitados solo para solicitudes remotas.
  4.   
  5. La propiedad IsLocal del objeto HttpRequest. Si los errores personalizados están habilitados   solo para solicitudes remotas, necesita   saber si la solicitud es de un   computadora remota.
  6.   

La idea aquí es que puede desactivar 'customErrors' durante el desarrollo, cuando desee ver los errores, y luego habilitarlo solo para producción.

Este artículo de MSDN discute más el atributo.

Otra razón para este problema puede ser,

En la aplicación Template MVC (generada por VS2008 / VS2008 Express), Error.aspx (generado por VS) usa la página maestra.

Si la página maestra accede a cualquier ViewData, arrojará una excepción de referencia nula, entonces el error.aspx no se mostrará.

Use este código simple como su Error.aspx, resolverá el problema (junto con CustomErrors = On)

<%@ Page Language="C#"  Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>
<%= Model.Exception.Message %>

También he tenido problemas con esto y creo que ahora entiendo el problema.

En resumen, los requisitos para que [HandleError] funcione como se espera son:

Debe habilitar errores personalizados en web.config Y también debe especificar dónde está su vista de error en la etiqueta <customErrors>.

Ejemplo:

<customErrors mode="On" defaultRedirect="Error" />

Salir de la parte defaultRedirect="Error" generará un error 500 en el navegador, NO la página de error ASP.NET (YSOD).

Además, no tiene que estar en modo Release. Probé esto con una compilación de depuración y funcionó bien.

Mi entorno era Visual Studio 2010 usando .NET 4 y el estándar, " ASP.NET MVC 2 Web Application " plantilla de proyecto.

Lo que me confundió fue la documentación de MSDN para la clase HandleErrorAttribute. No dice explícitamente que debe activar los errores personalizados en web.config . Y supuse que todo lo que necesitaba era el atributo [Handle Error].

Hay una situación tonta que una vez sucedió conmigo, por lo que podría ser útil para alguien.

Asegúrese de haber agregado <customErrors mode="On" /> al archivo correcto web.config.


A veces (especialmente, cuando trabajas con algo como Resharper y abres tus archivos escribiendo su nombre, pero no a través del Explorador de soluciones), puedes simplemente abrir un archivo web.config desde la carpeta Vistas o incluso desde otro proyecto.

Cuidado: en mi caso, estaba tratando de obtener el HandleError atributo para atrapar un exception arrojado dentro del Controller s constructor ! Por supuesto que no lo atrapará. El atributo OnException(ExceptionContext exceptionContext) solo captura excepciones lanzadas dentro de 500 acciones . Está justo en la página de MSDN (debería haber prestado más atención a eso):

  

Representa un atributo que se usa para manejar una excepción que es   lanzado por un método de acción.

Otra cosa que sucedía es que nunca se llamaba al método anulado <customErrors> del controlador. De nuevo: por supuesto, no se llamaría ya que estaba lanzando una excepción dentro del constructor de Web.config.

Pasé 1 hora tratando de resolver esto. : o) Espero que ayude a la próxima alma ...

Como pista: recuerde que el atributo <=> solo detecta <=> errores. Para los demás, debe declarar el <=> sección en <=>:

<customErrors mode="On">
  <error statusCode="403" redirect="~/403" />
  <error statusCode="404" redirect="~/404" />
</customErrors>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top