いくつかの方法が思い浮かびます。最も簡単な方法は、Application.ThreadException イベントをリッスンして、未処理の例外をすべてキャッチすることです。
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
Application.Run(new Form1());
}
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
MessageBox.Show(e.Exception.Message);
}
ただし、それは単にクラッシュを停止し、mdi フォームを閉じません。送信スレッドを停止すると、mdi フォームが完全に停止します (mdi の外の方が簡単で、サンドボックスで開始できる個別のスレッドでフォームを実行できます)。
私が通常行うことは、すべてのコードをサンドボックス化して実行することです。通常はアクション オブジェクト内にカプセル化されますが、i は単純な手順にすることもできます。
public static bool Run(Action a)
{
try
{
a();
return true;
}
catch(Exception ex)
{
//custom error handling here
return false;
}
}
呼び出し例:
private void button1_Click(object sender, EventArgs e)
{
Run( ()=>throw new Exception());
}
標準的な方法で実行すると、待機カーソルまたはロギングとして制御できるという追加の利点があります。mdi 環境でない場合は、いくつかの代替手段がありますが、これが実行可能であることを願っています。