2010-03-25 14 views
5

estoy ejecutando el código C# en Visual Studio en modo de depuración:¿Por qué Visual Studio no muestra un mensaje de excepción cuando ocurre mi excepción en un constructor estático?

public class MyHandlerFactory : IHttpHandlerFactory 
{ 
    private static Dictionary<string, bool> myDictionary = new Dictionary<string, bool>(); 
    static MyHandlerFactory() 
    { 
    myDictionary.Add("someKey",true); 
    myDictionary.Add("someKey",true); // fails due to duplicate key 
    } 
} 

Fuera del constructor estático, cuando llegue a la línea con el error de Visual Studio destaca y hace estallar para arriba un mensaje acerca de la excepción . Pero en el constructor estático no recibo tal mensaje. Estoy caminando línea por línea, así que sé que estoy llegando a esa línea y no más allá.

¿Por qué es esto?

(no tengo ni idea de si el hecho de que mi clase implementa asuntos IHttpHandlerFactory, pero lo incluyó por si acaso.)

Ésta es VS2005, .Net 2.0

Editar: sólo quiero para agregar, el hecho de que es un HttpHandler does parece importar. Como indican las respuestas, el comportamiento predeterminado es romper con TypeInitializationException en lugar de con la excepción interna. Probé otro ejemplo sin el HttpHandler y vi que esto causaba que el programa se rompiera en la primera línea que usaba la clase. Pero en este caso no hay ninguna línea en mi código para romper, ya que la clase solo se llamaba como un HttpHandler especificado en mi archivo web.config. Por lo tanto, no rompió la excepción en absoluto.

Respuesta

9

El problema es que la excepción lanzada es en realidad una TypeInitializationException que envuelve cualquier excepción que se arroje. No estoy seguro de qué compensaciones de diseño causaron esto, pero IMO es una de las cosas más molestas en el desarrollo de .NET, y estoy triste de ver que todavía existe en .NET 4.

En VS, para atrapar el excepción ASAP, tendrá que activar las excepciones de primera oportunidad. Vaya a Depurar> Excepciones y marque "Excepciones de Common Language Runtime", que se interrumpirá tan pronto como se produzca una excepción.

(Nota: si está utilizando Dynamic Language Runtime, tendrá que ser más selectivo con respecto a las excepciones detectadas, ya que aparentemente utiliza excepciones para el control de flujo).

+0

Gracias por la respuesta. Sin embargo, las opciones que veo en Depurar> Excepciones ... son "Excepciones de C++", "Excepciones de Common Language Runtime", "Asistentes de depuración administrados", "Comprobaciones de tiempo de ejecución nativas" y "Excepciones de Win32". Es ".Net Exceptions" debajo de uno de estos? No pude encontrarlo –

+0

@Tim Goodman - ¡OOPS! Quise decir "Excepciones de Common Language Runtime". Actualizaré mi respuesta. –

+0

Ah sí, lo que hace que se rompa cuando se lanzan las excepciones de Common Language Runtime causando que se rompa la excepción interna. Gracias. –

1

Probé tu código y recibí la TypeInitializationException como esperabas. No hay problema en mi VS ...

Pero si ejecuta esta (o cualquier otra) aplicación 'sin depurar', siempre debería recibir un mensaje de error para las excepciones no controladas: ninguna configuración VS hará la diferencia aquí.

+0

¿En qué línea obtuviste la TypeInitializationException? Estoy pensando que el problema es que normalmente daría un error en la primera línea para hacer referencia a la clase (la que hace que se llame al constructor estático), pero en este caso se llama como HttpHandler, por lo que no hay línea para ir. –

+0

La excepción TypeInitializationException aparece en la línea donde creo una nueva instancia de la clase: MyHandlerFactory factory = new MyHandlerFactory(); Pero lo intenté sin la interfaz de la que proviene. Tal vez podrías extender la muestra para que podamos probarla exageradamente, ya que está en tu código. – Machta

+0

Hoy volví a ver esta pregunta de hace 7 años, así que pensé que tendría una respuesta tardía a su comentario. :) Para reproducir el problema, creo que era necesario registrar el controlador HTTP en el archivo Web.config de una aplicación web ASP.NET (consulte aquí: https://msdn.microsoft.com/en-us/library/46c5ddfy. aspx) y acceder al intentar cargar una página de la aplicación web. –

0

El constructor estático se ejecuta antes de que su aplicación se ejecute en un dominio de aplicación. Probablemente esto esté causando problemas con la forma en que VS detecta la excepción, que a partir de su descripción no es estándar. Puede ser una limitación de 2005. Es por eso que siempre debe atrapar dentro del cuerpo del constructor estático. Hay una excelente discusión de esto en el nuevo libro Effective C#

Cuestiones relacionadas