2009-08-07 25 views
0

我在不同的類中有很多異步操作。如何在有很多異步操作的操作時捕獲WinForms中的異常

當出錯時,它會拋出從System.Exception繼承的特殊異常。
在某些形式中,我想通過messageBox來捕捉它。

函數「Application.ThreadException」無法捕捉它。

換句話說,當拋出一些異常時,我無法捕捉到函數的所有異常。 我該怎麼辦?

回答

4

訂閱應用.UnhandledException它觸發任何未處理的異常,並在EventArgs中公開帶有詳細信息的異常對象。

2

基本上你應該在每個線程的基礎上處理異常,並以Application.ThreadException作爲最後的手段。

如何做到這一點取決於你使用的異步模式,但使用例如當IAsyncResult的例外是「儲存」你和拋出,當你調用EndIvoke(..,IAR)

+0

例如,我們可以通過在web.config中設置錯誤數據來捕獲異常並將頁面重定向到asp.net中的錯誤頁面。 winform怎麼做? – 2009-08-07 16:03:38

0

正如亨克霍爾特曼已經建議你應該處理異常。只有那些未處理的討厭應該留給Application.ThreadException。如果您不知道,那麼雖然您可以在Application.ThreadException事件處理程序方法中顯示您的消息,但應用程序將隨後終止。某些例外情況未被Application.ThreadException捕獲,您將必須處理AppDomain.UnhandledException事件。 AFAIK最好不要在異步處理程序中拋出異常(大師們,如果我錯了,請糾正我)。處理它們的最好方法是在用戶調用結束調用或用戶嘗試檢索響應對象時引發異常。請注意,如果您從一個線程中獲取對象throw exc它不會被其他線程捕獲。所以,通知主線程的一種方法是引發一個你傳遞響應對象的事件(主線程已經掛鉤了)。如果發生錯誤,則在響應對象的getter中引發異常,否則返回響應對象。另一種方法是提出一個事件,告訴主線程異常。

編輯: 剛纔看到您的評論:

我們可以捕獲異常,並通過 重定向 頁面,在asp.net中的errorPage web.config中設置錯誤的數據。 winform怎麼做?

在winforms中沒有直接的方法。我這樣做的方法是每個線程都有一個HandleError方法。此方法將接受異常對象作爲參數,並檢查異常的類型將顯示消息框和/或記錄它。

0

在異步應用程序中異常是不正常的,因爲異常只能在所有線程(來自MSDN)上一次處理一次。目前,您可以使用事件/代表處理它。

VS2010有一個新的異常處理程序用於處理多線程異常。