none
スレッドの例外処理について RRS feed

  • 質問

  • いつも拝見させていただいております。

    今回はスレッドの例外処理についてです。

    以下のようにコードにおいて、

            public static void Main(string[] args)
            {
                // Add the event handler for handling UI thread exceptions to the event.
                Application.ThreadException += new ThreadExceptionEventHandler(Form1.Form1_UIThreadException);             // Set the unhandled exception mode to force all Windows Forms errors to go through
                // our handler.
                Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

                // Add the event handler for handling non-UI thread exceptions to the event.
                AppDomain.CurrentDomain.UnhandledException +=
                    new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

                // Runs the application.
                Application.Run(new Form1());
            }

            private void button2_Click(object sender, System.EventArgs e)
            {
                //ThreadStart newThreadStart = new ThreadStart(newThread_Execute);
                //Thread newThread = new Thread(newThreadStart);
                //newThread.Start();

                // 非同期スレッドの実行
                SampleDelegate a = new SampleDelegate(ThreadMethod);
                a.BeginInvoke(null, null);
            }

            // The thread we start up to demonstrate non-UI exception handling.
            void newThread_Execute()
            {
                throw new Exception("The method or operation is not implemented.");
            }

            private void ThreadMethod()
            {
               
                throw new Exception("非同期スレッドで起こった例外です。");
            }

            private delegate void SampleDelegate();

    button2_Clickにおいて、コメントアウトしているnewThreadについては、集約例外処理で拾えるのですが、SampleDelegateの方は拾う事ができません。
    これはAppDomainが違うからであると思っているのですが、それであっていますでしょうか?
    また、現在拾えないが集約例外処理で拾えるようにすることは可能でしょうか?

    よろしくお願いいたします。
    2009年10月8日 19:03

回答

  • button2_Clickにおいて、コメントアウトしているnewThreadについては、集約例外処理で拾えるのですが、SampleDelegateの方は拾う事ができません。
    これはAppDomainが違うからであると思っているのですが、それであっていますでしょうか?
    違います。BeginInvoke()で発生した例外はEndInvoke()を呼び出した時点でthrowされます。
    • 回答としてマーク freemann 2009年10月8日 23:34
    2009年10月8日 22:50

すべての返信

  • button2_Clickにおいて、コメントアウトしているnewThreadについては、集約例外処理で拾えるのですが、SampleDelegateの方は拾う事ができません。
    これはAppDomainが違うからであると思っているのですが、それであっていますでしょうか?
    違います。BeginInvoke()で発生した例外はEndInvoke()を呼び出した時点でthrowされます。
    • 回答としてマーク freemann 2009年10月8日 23:34
    2009年10月8日 22:50
  • ありがとうございます!

    おかげで解決しました。

    また、質問した時にはよろしくお願いいたします。
    2009年10月8日 23:35