2009-07-14 42 views
1

我有ThreadExceptionHandler測試WinForms應用程序,顯示未處理的異常被捕獲時,一個消息框,如下所示:ThreadExceptionHandler在MainFrm構造不要再追例外

[STAThread] 
static void Main() 
{ 
    Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Form1()); 
} 

static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) 
{ 
    MessageBox.Show("error caught"); 
} 

當我強迫的錯誤在窗體的構造函數1(例如dividebyzero)如下:

public Form1() 
{ 
    InitializeComponent(); 

    int i = 0; 
    int x = 5/i; 
} 

和運行Visual Studio之外的應用程序(在Windows 7中),零異常的鴻溝處理 - 我得到一個無用的「WindowsFormApplica重刑1已停止工作......「消息。

但是,當我將分頻比例例外移動到Form1_Load事件並重新運行時,正常處理異常。

有人可以解釋爲什麼會出現這種情況嗎?我運行這個測試程序的原因是因爲我正在嘗試追查另一個企業應用程序中遇到類似的未處理的異常問題。

回答

4

這可能是由於在調用Application.Run()之前執行構造函數所致。您的代碼也可以寫成

[STAThread] 
static void Main() 
{ 
    Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Form1 MyForm = new Form1(); 
    Application.Run(MyForm); 
} 

你的線程異常處理程序才成爲當Application.Run()正在執行積極的。爲了捕捉窗體構造函數中的異常,你需要圍繞Form1 MyForm = new Form1();女巫一個單獨的try/catch塊。

+0

+1 - 您的明確描述擊敗我的... :) – 2009-07-14 11:07:10

3

錯誤是在構造函數中拋出,而不是在線程代碼中。您的代碼:

Application.Run(new Form1()); 

會拋出異常,然後有上的代碼很行,該呼叫之前Application.Run(),所以線程代碼甚至沒有開始執行。

1

ThreadException處理異常UI線程異常。 UnhandledException處理非UI線程異常。

您需要將此行添加到您的Main():

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 

及以下到類:

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    MessageBox.Show("error caught 2"); 
} 
0

Application.ThreadException事件被稱爲每次申請拋出一個異常,然而在你的例子中,主線程拋出異常,你可以爲它添加一個try catch塊。

相關問題