首先讓我說我已閱讀this useful article徹底,並使用CodeProject中的SafeThread類。無論使用Thread還是SafeThread,我都會得到相同的結果。防止未處理的異常對話框出現
我已將我的問題簡化爲由兩種形式組成的應用程序,每種形式都有一個按鈕。主程序顯示一個表單。當你點擊那個按鈕時,一個新的線程開始顯示第二個表單。當你點擊第二個表單上的按鈕時,它在內部只是「拋出新的異常()」
當我在VS2008下運行這個時,我看到「DoRun()中的異常」。
當我運行VS2008的外面,我得到一個對話框「發生在應用程序中未處理的異常。如果您單擊繼續,應用程序......」
我試圖在應用程序設置legacyUnhandledExceptionPolicy。配置爲1和0.
在VS2008下運行時,我需要做什麼來捕獲以第二種形式拋出的異常?
這裏是我的Program.cs
static class Program
{
[STAThread]
static void Main()
{
Application.ThreadException += new ThreadExceptionEventHandler (Application_ThreadException);
Application.SetUnhandledExceptionMode (UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
try
{
Application.Run(new Form1());
}
catch(Exception ex)
{
MessageBox.Show("Main exception");
}
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
MessageBox.Show("CurrentDomain_UnhandledException");
}
static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
MessageBox.Show("Application_ThreadException");
}
}
這裏的Form1中:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
SafeThread t = new SafeThread(new SimpleDelegate(ThreadMain));
try
{
t.ShouldReportThreadAbort = true;
t.ThreadException += new ThreadThrewExceptionHandler(t_ThreadException);
t.ThreadCompleted += new ThreadCompletedHandler(t_ThreadCompleted);
t.Start();
}
catch(Exception ex)
{
MessageBox.Show(string.Format("Caught externally! {0}", ex.Message));
}
}
void t_ThreadCompleted(SafeThread thrd, bool hadException, Exception ex)
{
MessageBox.Show("t_ThreadCompleted");
}
void t_ThreadException(SafeThread thrd, Exception ex)
{
MessageBox.Show(string.Format("Caught in safe thread! {0}", ex.Message));
}
void ThreadMain()
{
try
{
DoRun();
}
catch (Exception ex)
{
MessageBox.Show(string.Format("Caught! {0}", ex.Message));
}
}
private void DoRun()
{
try
{
Form2 f = new Form2();
f.Show();
while (!f.IsClosed)
{
Thread.Sleep(1);
Application.DoEvents();
}
}
catch(Exception ex)
{
MessageBox.Show("Exception in DoRun()");
}
}
}
這裏是窗體2:
public partial class Form2 : Form
{
public bool IsClosed { get; private set; }
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
throw new Exception("INTERNAL EXCEPTION");
}
protected override void OnClosed(EventArgs e)
{
IsClosed = true;
}
}
你想要什麼樣的行爲? – scwagner 2009-07-09 18:08:40
異常中的堆棧跟蹤是什麼? – 2009-07-09 18:10:58
我想讓我的一個異常處理程序捕獲form2中button1_Click中引發的異常;這種情況發生在VS2008但不被外部 這裏的堆棧跟蹤的頂部 在Trapper.Form2.button1_Click(對象發件人,EventArgs e)如C:\ codefarm \捕手\ Form2.cs:線在System.Windows 17 .Forms.Control.OnClick(EventArgs e) at System.Windows.Forms.Button.OnClick(EventArgs e) – rc1 2009-07-09 18:21:12