2011-12-09 39 views
3

是否有任何理由更喜歡使用其中一種方法在Windows窗體應用程序中實現全局異常處理程序的方法之一?處理Application.ThreadException和將Application.Run包裝在Try/Catch中的區別

第一種方法

static void Main(string[] args) 
{ 
    try 
    { 
     System.Windows.Forms.Application.Run(mainform); 
    } 
    catch (Exception ex) 
    { 
     // Log error and display error message 
    } 
} 

第二種方法

static void Main(string[] args) 
{ 
    System.Windows.Forms.Application.ThreadException += 
     new ThreadExceptionEventHandler(Application_ThreadException); 
    System.Windows.Forms.Application.Run(mainform); 
} 

static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) 
{ 
    // Log error and display error message 
} 

是否處理ThreadException事件給你的東西,在try/catch語句不?

+1

第一種方法甚至不能在發佈模式下工作,即當你運行你的exe時,這將是一個未處理的異常,你不會到達catch塊;只在使用visual studio時才起作用。試試吧,在你的mainform中放一個按鈕並在那裏拋出異常。 – joedotnot

回答

5

我對此行爲的理解是,添加一個ThreadException處理程序將導致表單中的其他未處理的異常被此處理程序捕獲和處理,這將允許應用程序繼續運行。

在您的try/catch設計中,表單中的第一個未處理的異常將導致應用程序暫停。你會發現異常,但應用程序將結束。

請注意,在某些情況下還會發生一個AppDomain.UnhandledException事件(在主窗口窗體線程以外的線程中未處理的異常並且未捕獲ThreadException),所有這些都是您的應用程序的壞消息。

+0

啊,謝謝,現在你明確指出了這一點。謝謝你的幫助。 – kevev22

2

事件處理程序方法允許您的應用程序捕捉異常,嘗試從中恢復並繼續。 (即執行不留Application.Run

一個try/catch在主會捕獲異常,但你會留下Application.Run此時所有你能做的就是退出。

+0

非常感謝您的幫助。我會給你支票,但另一個答案是你擊敗了8秒。 – kevev22

相關問題