none
VisualStudioのデバック実行時にハンドルされない例外の出し方について RRS feed

  • 質問

  • こんにちは。アべです。

    C#2.0+VisualStudio2005でWinFormアプリを作成しております。

    例外が発生したらコードの実行をそこで止めるために、
    例外を発生させ、
      Application.ThreadException
       +=new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
    などで、例外処理を行いたいのですが、EXE実行にすると
    上手くいくのですが、デバック実行だと例外をthrowした
    タイミングでVisualStudioがそこでハンドルしてしまい
    ApplicationクラスのThreadExceptionイベントを発火して
    くれません。

    当方は、処理のキャンセルや特定の共通処理を例外の
    機構を使って開発しており、どうしてもデバック実行でも
    スムーズにThreadExceptionまで動かしたいと思っています。
    しかし、やり方がわからずに困り果てております。

    作成する例外の属性や開発環境の設定あたりで出来そうな
    気がするのですが調べてもわかりませんでした。
    どなたかやり方をご存知の方アドバイスをお願いします。


     

    2006年6月9日 5:45

すべての返信

  •  kiyo7447 さんからの引用

    例外が発生したらコードの実行をそこで止めるために、
    例外を発生させ、

    この部分がはっきりわからないため誤解しているかもしれませんが、VisualStudio が例外をどのように扱うかは、メニューの [デバッグ|例外] から設定できます。
     
    throw の段階で止める場合は「スローされるとき」、catch が存在しないことが判明した段階で止める場合は「ユーザにハンドルされていないとき」を on にします。
     
     kiyo7447 さんからの引用
    スムーズにThreadExceptionまで動かしたいと思っています。
     
    ということであれば、「ユーザにハンドルされていないとき」 を off にする必要があります。
    ( ThreadException はユーザにハンドルされていないときに発生するイベントのため )

     
    2006年6月10日 10:05
  • こんにちは。アべです。

    Lady.BUG さん有難うございます。

    試してみたのですが、上手く動作しませんでした。
    (ヘルプを見る限り、このやり方で問題なさそうなのですが、、、、)

    手順
        C#でWindowsApplicationを作成する。
        ソースは、
       
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                Application.ThreadException
                += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
                throw new SystemException("error");
            }

            void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
            {
                MessageBox.Show("これが表示されれば成功:" + e.Exception.Message);
            }
        }

        です。

        アドバイスいただいた「デバック」-「例外」の設定を変更して試して
        見ましたが、上手くThreadExceptionEventHandlerが発火しませんでした。
       
        何か環境の問題だと思うのですが、ご存知の方アドバイスをお願い致します。

    以上

    2006年6月14日 1:59
  • 最初にFormをNewする前に、イベントハンドラを登録するか
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
    しとく必要があると思います。

     あと、このようなイベントハンドラは普通初期化で一度だけ設定するものです。
    今のだと、Clickのたびにハンドラが追加登録されてしまいます。

    2006年6月14日 9:52
  • なちゃさん 有難うございます。

    頂いた情報の通り、フォームのインスタンスを作成する前に例外ハンドラを
    追加してやらなければならない事がわかりました。(なぜかは不明?)

    下記の「フォームのインスタンスを作成する」と「例外ハンドラの追加」の
    順序によって動きが変わることがわかりました。

    --正しく動く
     Application.ThreadException
     += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
     Form f = new Form1();
     Application.Run(f);


    --正しく動かない
     Form f = new Form1();
     Application.ThreadException
     += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
     Application.Run(f);

     

    有難うございました。

    2006年6月14日 23:25