4

Editor単一のクラス(から継承する)を持つWindowsフォームアプリケーションがありますForm

public partial class Editor : Form
{
    public Editor()
    {
        InitializeComponent();

        Load += Editor_Load;
    }

    private void Editor_Load(object sender, EventArgs e)
    {
        cmbConnections.DataSource = ConnectionManager.Connections;
        cmbConnections.Visible = false;
    }

}

デザイナーが生成したコードを除いて、これはフォームの唯一のコードです(1つのコンボボックス()のみが含まれていますcmbConnections)。

このConnectionManagerクラスは、静的コンストラクターを持つ静的クラスです。コンストラクターは初期化を行い、重大な状態をテストします。条件が満たされた場合、コンストラクターは例外をスローします。ただし、この例外はVisual Studio 2010のデバッグモードでは発生しません。これをテストするためthrow new Exception()に、ConnectionManagerの静的コンストラクターのみを配置しました。が使用されるため、イベントハンドラーConnectionManagerで(初めて)初期化されます。Editor_Load静的コンストラクターが呼び出され、例外がスローされます(出力ウィンドウにのみ表示されます)。残りのEditor_Loadイベントハンドラー(cmbConnections.Visible = false;)は、期待どおりに実行されません。

しかし、私が理解していないのは、なぜ私のVS2010が例外を飲み込んだのかということです。デバッグは中断されませんでした。try/catchブロックで囲まれていません。メインウィンドウでプログラム実行を続けました。まるでEditor_Load別のスレッドで実行されたかのようです。

出力ウィンドウにメッセージが表示されます。

Editor.exeで「System.InvalidOperationException」タイプの最初のチャンスの例外が発生しました

Editor.exeでタイプ'System.TypeInitializationException'の最初のチャンスの例外が発生しました

しかし、デバッグモードでは実行が中断されませんでした。

この動作に影響を与える可能性があると私が信じているオプションのいくつかを次に示します。

プロジェクトのプロパティ->ビルド->一般->コードの最適化はチェックされていません。

[ツール]->[オプション]->[デバッグ]->[一般]->[自分のコードだけを有効にする]がオンになっています。

例外設定では、「user-unhandled」のチェックボックスがチェックされています。

私は何かが足りないのですか?この動作は正常ですか?VS2010は未処理の例外をスローすると思いました。そして、ここではこれは処理されておらず、まだ壊れていません。

4

1 に答える 1

1

例外ダイアログでマネージ (.NET) 例外の「スロー」を有効にする必要があるのは設計によるものだと思います ( Ctrl-Alt-E)。1

多くの偽の (処理された) 例外を避けるために、私は通常、イニシャライザが実行されるポイントに近づき、続行する直前にそのチェックボックスをオンにします。

また、ローダー例外がある場合は、ネストされた内部例外または例外内のローダー情報を確認してください。通常、例外自体はそれほど有益ではありません。実際のエラーを見つけるために、ラッピング例外の 2 つ以上のレイヤーを頻繁に掘り下げる必要がありました。


1その理由については推測することしかできません。私の感じでは、静的型初期化子は決定論的に実行されるとは見なされません (多くのことがトリガーになる可能性があり、順序はしばしば定義されていません。型の静的コンストラクターが使用される前に実行されることが保証されているだけですが、コードのほぼすべての場所で、知らないうちに、または明示的にトリガーすることなく使用されます)。

したがって、ランタイムが「ユーザーコードによって処理された」かどうかを確認するのは困難です (イニシャライザーがいつ実行されるかが決定論的にわからないため、ユーザーはそれを処理することを期待すべきではありません)。

ただし、これは私の推測です。

于 2012-02-09T23:44:57.603 に答える