asp.net-mvc - the - handleerror angular 6
ASP.net MVC[HandleError] no captura excepciones (6)
En dos aplicaciones diferentes, una a medida, la otra en la aplicación MVC de muestra que obtiene con un nuevo proyecto MVC VS2008, [HandleError] no está detectando 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 que se lanza 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 primero surgió en una aplicación personalizada en la que estoy trabajando, lo que me llevó a probarlo con la aplicación de ejemplo. 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) de la tirada en el método de índice.
Estoy perplejo. ¿Qué me estoy perdiendo?
Cuidado: en mi caso, estaba tratando de obtener el atributo HandleError
para detectar una exception
lanzada dentro del constructor del Controller
. Por supuesto que no lo atrapará. El atributo HandleError
solo HandleError
excepciones lanzadas dentro de las acciones del Controller
. Está justo ahí en la página de MSDN (debería haber prestado más atención a eso):
Representa un atributo que se utiliza para manejar una excepción que se produce mediante un método de acción.
Otra cosa que estaba sucediendo es que OnException(ExceptionContext exceptionContext)
se OnException(ExceptionContext exceptionContext)
el OnException(ExceptionContext exceptionContext)
del Controlador. Otra vez: por supuesto, no se llamaría ya que estaba lanzando una excepción dentro del constructor del Controller
.
Pasé 1 hora tratando de resolver esto. : o) Espero que ayude al proximo alma ...
Como sugerencia: recuerde que el atributo HandleError
solo HandleError
500
errores. Para los otros debe declarar la sección <customErrors>
en Web.config
:
<customErrors mode="On">
<error statusCode="403" redirect="~/403" />
<error statusCode="404" redirect="~/404" />
</customErrors>
En Web.config, cambie customErrors:
<system.web>
<customErrors mode="On">
</customErrors>
Si el modo es Desactivado o Solo Remoto, verá la pantalla amarilla de la muerte en lugar de la página de error personalizada. El razonamiento es que los desarrolladores generalmente quieren información más detallada en la pantalla amarilla de la muerte.
Otra razón para este problema puede ser,
En la aplicación de plantilla MVC (generada por VS2008 / VS2008 Express), Error.aspx (generado por VS) utiliza la página maestra.
Si la página maestra accede a cualquier ViewData, arrojará una excepción de referencia nula, entonces no se mostrará el error.aspx.
Utilice 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 luchado con esto y creo que ahora entiendo el problema.
En resumen, los requisitos para que [HandleError]
funcione como se espera son:
Debe habilitar los errores personalizados en web.config Y también debe especificar dónde se encuentra su vista de error en la etiqueta <customErrors>
.
Ejemplo:
<customErrors mode="On" defaultRedirect="Error" />
Si se deja fuera de la parte defaultRedirect="Error"
generará un error 500 en el navegador, NO la página de error ASP.NET (YSOD).
Tampoco tienes que estar en modo Release. Probé esto con una versión de depuración y funcionó bien.
Mi entorno era Visual Studio 2010 usando .NET 4 y la plantilla de proyecto estándar "ASP.NET MVC 2 Web Application".
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 asumí que todo lo que necesitaba era el atributo [Handle Error]
.
Hay una situación tonta que una vez pasó conmigo, por lo que podría ser útil para alguien.
Asegúrese de haber agregado <customErrors mode="On" />
al archivo web.config
correcto .
A veces (especialmente, cuando trabaja con algo como Resharper y abre sus archivos escribiendo su nombre, pero no a través del Explorador de soluciones), simplemente puede abrir un web.config desde la carpeta Vistas o incluso desde otro proyecto.
Importante: ¡ Tenga cuidado de que su propia página de error no contenga un error!
Si lo hace, terminará con esa página de error personalizada de ASP.NET y terminará dando vueltas en círculos y desgarrándose el cabello. Simplemente quite todo de la página que pueda causar un error y pruébelo.
También con respecto a que ''customErrors'' esté ENCENDIDO o APAGADO, hay varios factores que contribuyen a que se muestre o no la página de error amigable (su Errors.aspx) o no.
Ver este blog (excepto abajo)
HttpContext.IsCustomErrorEnabled: examina tres fuentes diferentes
- La propiedad minorista de la sección <deployment> de web.config. Esta es una propiedad útil para establecer al implementar su aplicación en un servidor de producción. Esto anula cualquier otra configuración para errores personalizados.
- La propiedad de la sección <customErrors> de web.config. Esta configuración indica si los errores personalizados están habilitados y, si es así, si están habilitados solo para solicitudes remotas.
- La propiedad IsLocal del objeto HttpRequest. Si los errores personalizados están habilitados solo para solicitudes remotas, debe saber si la solicitud proviene de una computadora remota.
La idea aquí es que puede tener desactivados ''CustomErrors'' durante el desarrollo, cuando desee ver los errores y habilitarlos solo para producción.
Este artículo de MSDN trata el atributo más a fondo.