9

私は、ハンドルされていないすべての例外をキャッチする小さなライブラリを作成しています。小さなダイアログ (NF の通常のダイアログに似ています) を表示し、ユーザーに例外を開発者に送信する機会を与えます。これを行うには、AppDomain の UnhandledException-Event を次のように使用します。

app.UnhandledException += (object sender, UnhandledExceptionEventArgs e) =>
        {
            ExceptionHandler handler = new ExceptionHandler((Exception)e.ExceptionObject, ExEntry);
            UnhandledExceptionListened(handler);
            if (Properties.Settings.Default.ShowStandardExceptionDialog)
            {
                ExceptionDialog exdialog = new ExceptionDialog(handler);
                exdialog.ShowDialog();
            }
        };

ExceptionHandler と ExEntry は、私のライブラリのクラスです。しかし: 例外が発生した場合、コンパイラはラムダ式にジャンプし、コードの最初の行をデバッグしようとし、ラムダの残りの部分を処理せずに以前に発生したエラーを表示します。しかし、私が書くだけなら:

 app.UnhandledException += (object sender, UnhandledExceptionEventArgs e) =>
        {
                ExceptionDialog exdialog = new ExceptionDialog(handler);
                exdialog.ShowDialog();
        };

それは完全に機能します。なぜこれがうまくいかないのか、誰にも分かりますか?

4

2 に答える 2

5

2 つの理由が考えられます。

1 つは、 UnhandledExceptionModeを適切に設定していないことです。

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

もう 1 つは、ThreadExceptionを処理しなかったため、スローされた例外は未処理の例外ではなく、スレッド例外でした。

以下は例です。シナリオに応じて変更する必要があります。

Application.ThreadException+=
    new ThreadExceptionEventHandler(Log.WriteThreadException);

AppDomain.CurrentDomain.UnhandledException+=
    new UnhandledExceptionEventHandler(Log.WriteUnhandledException);

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
于 2013-05-23T16:25:57.073 に答える