2008-12-30 85 views
1

在每個工作線程方法中插入try/catch塊的方法是否有處理Windows窗體中未處理的非UI線程異常的方法?在Windows窗體中未處理的非UI線程異常

Thread.GetDomain().UnhandledException非常適合捕捉錯誤,但到那時對它做任何事情都太遲了(除了記錄它)。控制通過UnhandledException處理程序後,應用程序將終止。你可以期望的最好的是一個通用的Windows錯誤,看起來這樣的:

http://i40.tinypic.com/2be98i.jpg

我所有的研究表明,你必須插入輔助線程方法的try/catch塊,但我希望把如果有人有不同的需要,那麼這裏。

謝謝。

回答

2

如果您想在遇到UnhandledException之前對錯誤做些什麼,那麼您需要在線程方法中使用try/catch。

你至少應該在這裏處理像FileNotFoundException這樣的異常,在這裏你可以做一些聰明的事情。如果一切都失敗了,你可以使用UnhandledException徹底處理任何你沒有想到的事情(希望這是沒有的)。

0

這聽起來像你誤解......你不把代碼「放入」一個線程。你在一個線程上運行代碼。

無論你放置try catch塊,它最終都可以在任何線程上執行......如果你想讓catch中的代碼做一些操作UI元素,你只需要「運行」代碼創建UI元素的任何線程(如有必要)。

每個WinForms UI元素都有兩個成員可以幫助您解決這個問題InvokeRequired(),如果它在任何線程上執行,則返回一個布爾值,而不是創建元素的線程(在這種情況下,您必須切換線程)和BeginInvoke()會自動切換到正確的線程。

+0

權。我應該更清楚了。當我寫'工作線程方法'時,我正在談論線程啓動時將執行的代碼。它不是'UI線程'到'工作線程'*切換*問題,因爲它是一個錯誤處理問題。謝謝。 – 2008-12-30 18:42:08

1

Thread.GetDomain()。UnhandledException解散爲AppDomain.UnhandledException,通常對於應用程序中的所有線程都是相同的域 - 換句話說,您只需掛鉤一次該事件,而不是每個線程一次。

輔助線程中未處理的異常將終止該線程。看到SafeThread一種替代

警告:我是SafeThread文章

0

處理異常的作者,您必須插入的線程中執行的代碼內try/catch塊。

如果你仔細想一想,UnhandledException實際上是有名的。這個例外是'未處理',因此你無法做任何事情。太晚了!

真的,除了線程的上下文之外,沒有太多可以做到「保存」它不會崩潰,因爲沒有上下文需要糾正。因此,UnhandledException對於日誌記錄和嘗試確定爲什麼在崩潰後崩潰有用。

如果你想想如何try/catch語句的工作原理:

try 
{ 
    // run this code 

} 
catch (Exception ex) 
{ 
    // an exception happened in the above try statement inside MY thread 
}