none
例外の通知について RRS feed

  • 質問

  • 例外の通知についてですが、出るときと出ないときがあります。

    たとえば、

    Form1が1つだけあるプロジェクトを作成して、

    (例1)

    Form1のLoadイベントに

    throw new System.Exception("test");

    を入力し実行すると、上図の例外通知がでるのですが、

    (例2)

    そうではなく、Form1のコンストラクタに

    throw new System.Exception("test");

    を入力すると、例外の通知が出ません。

    ビルドしたexeファイルを実行すると何の反応もない(表示すらしない)ので、

    ちゃんと起動しているかどうか確認するために、

    タスクマネージャーでみると起動はしますが一瞬で消えて無くなります。

    例2(コンストラクタ内の例外)でも例外の通知が出るようにするにはどうしたらよいでしょうか?


    2013年4月6日 5:54

回答

  • Form1 が最初のフォーム(厳密には Program.cs で Application.Run に渡しているフォーム)であるならば、難しいか、無理だと思います。

    掲示されている例外ダイアログは、Application.Run が動き始めてからしか表示されることはありません。
    Form1 のコンストラクタはその Application.Run を動かすために、先に作っているものなので、その時点の例外は対象外になります。

    例外発生時に何らかのメッセージを表示したいのであれば、new Form1() を含むブロックを try-catch で囲み、自作のメッセージダイアログなどを表示するぐらいでしょうか。

    static class Program
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            try
            {
                Application.Run(new Form1());
            }
            catch(Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }
    }

    2013年4月6日 6:06
    モデレータ

すべての返信

  • Form1 が最初のフォーム(厳密には Program.cs で Application.Run に渡しているフォーム)であるならば、難しいか、無理だと思います。

    掲示されている例外ダイアログは、Application.Run が動き始めてからしか表示されることはありません。
    Form1 のコンストラクタはその Application.Run を動かすために、先に作っているものなので、その時点の例外は対象外になります。

    例外発生時に何らかのメッセージを表示したいのであれば、new Form1() を含むブロックを try-catch で囲み、自作のメッセージダイアログなどを表示するぐらいでしょうか。

    static class Program
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            try
            {
                Application.Run(new Form1());
            }
            catch(Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }
    }

    2013年4月6日 6:06
    モデレータ
  • 回答ありがとうございます。

    なるほど、既定の例外画面は出せないということですね。

    でも、ご呈示いただいたコードを使って自作のメッセージダイアログを作成したいと思います。

    ありがとうございました。


    2013年4月6日 7:52
  • 例外の発生はプログラムの誤りでしかありません。通知が出るようにするのではなく、そもそも例外が発生しないようにすべきです。

    開発の途中でどこでどのような例外が発生しているのかを把握したいのであれば、デバッグすべきです。

    2013年4月6日 7:55
  • 回答ありがとうございます。

    確かにその通りなのですが、実は開発環境ではなく、エンドユーザーの環境において、Form1が呼び出される前に処理を行っているのですが、そこで例外が通知されることなく終了するので、その原因を特定したいと思い、例外の通知ができないのかな?と質問させていただきました。

    開発環境であればデバッグもできるのですが...(T_T)

    2013年4月11日 9:34