8

ここで質問するのが適切かどうかはわかりませんが、とにかく質問します。

2 つの .NET アプリケーションがあります。1 つは自分でコンパイルしたもので、もう 1 つはそうではありません。どちらも .NET Framework 4.5 を使用します。ただし、例外の処理は異なります。

私がコンパイルしなかったアプリケーションで。未処理の例外ダイアログが表示されます(これは私が望んでいて期待しています)

コンパイルしなかったアプリからの未処理の例外

しかし、アプリケーションではコンパイルしました。アプリケーションがクラッシュしたことを示しているだけです。

コンパイルしたアプリからの未処理の例外

したがって、VS 構成またはプロジェクト構成に、未処理の例外ダイアログがコンパイルしたアプリに表示されないようにする設定が必要ですか?...

私はVSを再インストールしようとしましたが、Debug->Exceptionsメニューの設定を変更しましたが、どちらもうまくいきませんでした...

4

2 に答える 2

12

一番上のスクリーンショットは ThreadExceptionDialog です。これは、Winforms アプリがメッセージ ループ (Application.Run) によって起動されたイベント ハンドラーで爆発し、それ以外の方法でアプリが Application.ThreadException イベント ハンドラーを再割り当てしなかったという非常に特殊なケースで表示されます。これを使用するのはあまり良い方法ではありません。[続行] ボタンと [終了] ボタンのどちらをクリックするかをユーザーが知る合理的な方法はありません。必ず Application.SetUnhandledExceptionMode() を呼び出して無効にしてください。

一番下のスクリーン ショットは、Windows の既定のエラー報告ダイアログで、プログラムが未処理の例外で爆撃したときに Windows によって表示されます。ダイアログには、誰かが問題を診断して修正するのに役立つ十分な情報が表示されませんAppDomain.CurrentDomain.UnhandledException イベントのイベント ハンドラーを常に記述します。e.ExceptionObject.ToString() を表示および/またはログに記録し、 Environment.Exit() を呼び出してアプリを終了します。

Program.cs ソース コードを次のようにします。

    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
        Application.Run(new Form1());
    }

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
        // TODO: improve logging and reporting
        MessageBox.Show(e.ExceptionObject.ToString());
        Environment.Exit(-1);
    }
于 2012-07-21T09:59:29.947 に答える