ASP.NET OnError no captura la excepción ConfigurationErrorsException

Se estaba lanzando una ConfigurationErrorsException desde una biblioteca de clases vinculada a un sitio ASP.NET. El sitio registra todos los errores utilizando el evento de error Global.ASAX y anulando el método protegido de la página ASP.NET OnError (). Ninguno de los cuales manejó la excepción ConfigurationErrorsException cuando se lanzó.

Cuando se cambió el tipo de excepción en la biblioteca de clases de ConfigurationErrorsException a ApplicationException, el método OnError de la página controla la excepción.

¿Por qué el tipo de excepción lanzada cambia la forma en que ASP.NET maneja la excepción? Si desea que todos los errores se manejen en la página de ASP.NET OnError y / o Global.asax ¿Evento de error, qué excepciones son seguras de lanzar?

El siguiente código demuestra lo que he descrito. Se alcanzará un punto de interrupción en OnError cuando haga clic en el botón Excepción de la aplicación, pero no cuando haga clic en el botón Excepción de configuraciones …

       

Código detrás

 using System; using System.Configuration; using System.Web; namespace OnErrorTest { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected override void OnError(EventArgs e) { HttpContext ctx = HttpContext.Current; System.Exception exception = ctx.Server.GetLastError(); } protected void bthnAppEx_OnClick(object sender, EventArgs e) { throw new ApplicationException("Application Error"); } protected void btnConfigEx_OnClick(object sender, EventArgs e) { throw new ConfigurationErrorsException("Configurations Error"); } protected void btnInvalidOpEx_OnClick(object sender, EventArgs e) { throw new InvalidOperationException("Configurations Error"); } } } 

EDITAR: Se sugirió que la excepción ConfigurationErrorsException es una excepción del sistema y está destinada a ser lanzada por .NET Framework y no por una aplicación. De hecho, se deriva de SystemException, sin embargo, también lo hace InvalidOperationException. OnError captura InvalidOperationException

CONCLUSIÓN: No arroje nada derivado de ConfigurationException a menos que su intención sea que no se procese en el método OnError de una página ASP.NET o en los controladores de excepciones globales. He probado MVC y ningún Controller.OnException no tiene tal discriminación contra ConfigurationException.

ProcessRequestMain un ProcessRequestMain en el código fuente de ProcessRequestMain . Hay un bloque try...catch en este método que atrapa cualquier ConfigurationException y lo lanza de nuevo (mira en la línea 4680). Todas las demás excepciones se entregan al método HandleError que llamará a OnError . (También la ThreadAbortException se maneja por separado, lo que no es su preocupación aquí).

Esta es la razón por la que no puede capturar ConfigurationException (y ConfigurationErrorsException que se hereda de ConfigurationException ) utilizando el método OnError o el evento Error en una página ASP.NET.

Creo que es porque un error de configuración esencialmente bloquea la aplicación para que no se ejecute correctamente y, además, según la documentación, la intención no es de lanzarla nosotros, sino el propio marco. Como la mayoría de las configuraciones hacen que la aplicación no funcione, no sería capaz de detectar el error de configuración con una herramienta de registro, ya que no puede configurar el entorno para ejecutar la herramienta de registro cuando llega a ese error.