2012-04-17 15 views
9

私はこのような状況に遭遇しました。 WinFormsアプリケーションには2つの形式があります。メインフォームにはボタンがあり、ユーザーがクリックするとモーダルダイアログが表示されます。ダイアログフォームにもボタンがあり、ユーザーがクリックすると例外がスローされます。モーダルダイアログを使用するWinFormsアプリケーションでの例外処理の動作

例外処理は、アプリケーションがデバッガで実行され、それ自体が実行されている場合、が異なります。ここ は、この動作を再現する、最小限のコードです:デバッグ時に

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      using (var dialog = new Form2()) 
      { 
       dialog.ShowDialog(); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Oops! " + ex.Message); 
     } 
    } 
} 

public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 
} 

、例外を上げると、ダイアログを閉じ、Form1.button1_Clickで例外ハンドラは、例外を処理します。

アプリケーション自体を実行しているときに、例外を発生させても、はダイアログを閉じません。これの代わりに、デフォルトのApplication.ThreadExceptionハンドラが呼び出されます。

なぜ動作が異なりますか?お互いにどのようにそれをもたらすか?

答えて

8

あなたProgram.Main()でこれを試してみてください:

[STAThread] 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException); 
    Application.Run(new Form1()); 
} 

理由は、Windowsがアセンブリは、Visual Studioホスティングプロセスの外部で実行されているフォームの方法で行うことです。 この参照してください:あなたが上記のコード行を設定した場合

http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx

を:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

とVSでそれを実行し、デフォルトの動作が何であるかが表示されます - にダイアログボックスコード内の最初の例外を乗り越えたら参照が表示されます。デフォルトは、ホステッドモードで実行するかスタンドアロンモードで実行するかによって単純に異なります。

「なぜ」はMSリンクでカバーされています。エラーは、別のスレッドのイベントハンドラで発生します。デフォルトの動作は、これをWinFormsの下でのみ異なる方法で扱うことです。ダイアログに、あなたの呼び出しの後、この行を置く場合:

throw new Exception("Bah!"); 

をそしてCatchExceptionに行動を続けるあなたが期待するとして、それはあなたの例外ハンドラに行くことがわかります。別の方法で処理されるイベントハンドラの例外です。希望が役立ちます。

+0

ありがとうございます!これは私の質問の「方法」に関する答えです。 "なぜ、何のために"まだ実際... – Dennis

+2

理解しています。 Why/What For私はこれを.NETフレームワークの欠点の1つにするだけです。私は訂正されているかもしれませんが、誰かがアプリケーションが実行されているコンテキストによってこの動作が異なる理由が分かっているかどうかを知ることに興味があります。私はそれがちょっとした落とし穴であることに同意します。 –

関連する問題