2012-09-06 40 views
5

Recibo la excepción: The type initializer for 'my class' threw an exception. en mi navegador después de ejecutar mi aplicación web. Dado que esto parece ser un mensaje de error generado a partir de la vista (.aspx), no hay manera de que pueda ver el seguimiento de la pila o cualquier registro para el origen de este error.Cómo depurar "El inicializador de tipo para 'mi clase' lanzó una excepción"

He leído un poco sobre la red y una solución para la depuración es arrojar un TypeInitializationException y luego mirando la excepción interna para averiguar qué estaba mal. ¿Cómo puedo hacer esto cuando no sé dónde rodear el código con un try/catch?

+0

Establecer un punto de interrupción en los constructores de 'mi clase'? – Frobzig

+0

¿Tiene un constructor estático? ¿O usas variables estáticas en la clase? – code4life

Respuesta

11

Esto puede ser causado por un mal constructor estático o por una mala inicialización en línea de propiedades/campos estáticos. Por ejemplo:

class A 
{ 
    static A() 
    { 
     //buggy code here 
    } 
    static SomeField f = new ThisClassThrowsWhenConstructed(); // <-- or here 
} 
1

Esta excepción se produce cuando el constructor estático de 'mi clase' falla. Por favor ponga su punto de quiebre allí.

+0

de hecho, el constructor nunca fue golpeado porque el problema era con una variable global estática configurada en una clave de parámetro no existente en el web.config. Quité la línea y ahora funciona ... –

+0

Sí, esto es posible porque las compilaciones en línea variables estáticas (y no estáticas) son compiladas por el compilador de C# en el constructor. Eso explica tu situación. La respuesta de @spender menciona esto. –

+0

Supongo que esto se debe a que una asignación en línea de variable estática se ejecuta de forma diferente que si no se asignó en línea ... –

0

Hay algo que cuando está mal en su constructor estático de la clase, y en lugar de arrojar ese error, el CLR arrojará TypeInitializationException.

2

Finalmente encontré la razón de este problema es la configuración de AppConfig de mi proyecto. Sí, tengo dos proyectos C#, Project1 y Project2.

Proyecto1 es estático contiene la clase MyDetails

public static MyDetails 
{ 
    public static int _LogLevel = Int32.Parse(ConfigurationManager.AppSettings["LogLevel"]) 

    public static GetData() 
    { 
    ----code---- 
    ----code---- 
    } 
} 

He siguientes ajustes appconfig en Proyecto1

<appSettings> 
    <add key="LogLevel" value="5"/> 
</appSettings> 

La función MyDetails.GetData() está siendo llamados desde Project2 que es el proyecto que estoy depurando ahora. Desde Project2 es el proyecto de destino, la línea ConfigurationManager.AppSettings ["LogLevel"] intentará leer la configuración LogLevel desde Project2. pero la configuración de LogLevel solo está disponible en Project1. por lo tanto, debemos agregar aplicaciones en Project2.

El tema El inicializador de tipo para produjo una excepción se ha resuelto después de añadir los appsettings folowing en appconfig de Project2,

<appSettings> 
    <add key="LogLevel" value="5"/> 
</appSettings> 
Cuestiones relacionadas