8

The type initializer for 'my class' threw an exception.Webアプリケーションを実行した後のブラウザで例外が発生します。これはビュー(.aspx)から生成されたエラーメッセージのようであるため、このエラーの原因のスタックトレースまたはログを確認する方法はありません。

私はネットを少し読んだことがありますが、デバッグの1つの解決策は、をスローしてTypeInitializationExceptionから内部例外を調べて、何が問題だったかを調べることです。コードをtry/catchで囲む場所がわからない場合、どうすればこれを行うことができますか?

4

5 に答える 5

14

これは、静的コンストラクターが不適切であるか、静的プロパティ/フィールドのインライン初期化が不適切であることが原因である可能性があります。例えば:

class A
{
    static A()
    {
        //buggy code here
    }
    static SomeField f = new ThisClassThrowsWhenConstructed(); // <-- or here
}
于 2012-09-06T17:54:55.673 に答える
5

最後に、この問題の理由はプロジェクトのAppConfig設定にあることがわかりました。はい、Project1Project2の2つのC#プロジェクトがあります。

Project1には、静的クラスMyDetailsが含まれています

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

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

Project1に次のappConfig設定があります

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

関数MyDetails.GetData()は、現在デバッグしているプロジェクトであるProject2から呼び出されています。Project2 がターゲットプロジェクトであるため、ConfigurationManager.AppSettings ["LogLevel"]行は、Project2から設定LogLevelを読み取ろうとします。ただし、LogLevel設定はProject1でのみ使用できます。したがって、 Project2にappsettingsを追加する必要があります。

Project2のappConfigに次のappsettingsを追加した後、例外をスローするためのタイプ初期化子が解決されました。

<appSettings>
    <add key="LogLevel" value="5"/>
</appSettings>
于 2013-10-26T03:52:09.300 に答える
1

この例外は、「myclass」の静的コンストラクターがクラッシュしたときにスローされます。そこにブレークポイントを置いてください。

于 2012-09-06T17:50:14.723 に答える
0

クラスの静的コンストラクターで間違っていると、そのエラーをスローする代わりに、CLRがスローするものがありTypeInitializationExceptionます。

于 2012-09-06T17:50:23.993 に答える
0

ヒント:エラーが発生した同じクラス内に複数の静的コンストラクターがある場合は、最初の静的コンストラクターまたはそれらすべてにブレークポイントを設定します。

静的コンストラクターの珍しい点は、構築中に問題が発生しても、構築が行われた時点でエラーが発生しないことです。後で、静的に構築されたオブジェクトが呼び出されたり使用されたりする時点でエラーが発生します。

たとえば、私の場合:A、B、Cの3つの静的コンストラクターがあります。プログラムはエラーになり、Cの値にアクセスした時点で一時停止します。Cの静的コンストラクターにブレークポイントを設定しましたが、ブレークポイントがヒットしませんでした。何が起こるのですか?

Bの静的コンストラクターが悪いことが判明したため、Cの静的構築は行われません。Bの構築が失敗するとすぐにエラーがポップアップするはずだったので、混乱します。

于 2021-08-02T16:49:08.267 に答える