いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

アプリケーションで未ハンドルの例外を補足する。(Application.ThreadException, AppDomain.UnhandledException)

.NETにて、ハンドルされていない例外を補足するには2つの方法があります。

  • Windowsフォーム内にて発生した未ハンドル例外を補足する。
    • Application.ThreadException
  • フォーム以外で発生した未ハンドル例外を補足する。
    • AppDomain.UnhandledException


2番目の方のUnhandledExceptionについては、以下のようにして設定します。

Thread.GetDomain().UnhandledException += xxxxxx


以下、サンプルです。

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:
using System;
using System.Threading;
using System.Windows.Forms;

namespace Gsf.Samples.Tmp{

    public class ApplicationThreadExceptionSample : IExecutor{

        class InnerForm : Form{

            public InnerForm(){
                Load += delegate(object sender, EventArgs e){
                    throw new InvalidOperationException("未ハンドルの例外発生!!");
                };
            }
        }

        public void Execute(){

            /////////////////////////////////////////////////////////////
            //
            // フォーム内で発生した、未ハンドルの例外を補足する。
            //
            Application.ThreadException += delegate(object sender, ThreadExceptionEventArgs e){
                MessageBox.Show(e.Exception.Message);
                Application.Exit();
            };

            Application.Run(new InnerForm());

            /////////////////////////////////////////////////////////////
            //
            // フォームとは関係ない、スレッドでの未ハンドル例外を補足する。
            //
            Thread.GetDomain().UnhandledException += delegate(object sender, UnhandledExceptionEventArgs e){
                Console.WriteLine("未ハンドルの例外をキャッチ:{0}", (e.ExceptionObject as Exception).Message);
                Environment.Exit(-1);
            };

            Thread t = new Thread(delegate(){
                throw new InvalidOperationException("未ハンドルの例外発生2!!");
            });

            t.Start();
            t.Join();
        }
    }
}

上記のサンプルを実行すると、フォーム内で発生した例外に関してはメッセージボックスが表示され
その後のスレッドで発生した例外に関しては、コンソールにメッセージが表示されます。



================================
過去の記事については、以下のページからご参照下さい。