2011-01-10 60 views
9
catch (ThreadAbortException) 
{ } 
catch (Exception ex) 
{ 
    TraceManager.TraceException(ex, 
           (int)ErrorCode.GENERIC_EXCEPTION, 
           ex.StackTrace + "\n" + ex.Message + "\n" + VendorUrl); 
} 

是否有意義,甚至有捕獲ThreadAbortException並執行任何操作是否有意義?

catch (ThreadAbortException) 
{ } 

或將導致該ThreadAbortException被吞噬,永遠失去了什麼?

+4

`ThreadAbortException`將在處理程序完成時重新生成。 – Gabe 2011-01-10 21:16:27

回答

29

ThreadAbortException不能被「完全」捕獲;它將自動重新排列在catch塊的末尾(請參閱鏈接的MSDN文檔頁面),除非首先調用Thread.ResetAbort

因此,唯一明智的catch塊將是:

catch (ThreadAbortException) 
{ 
    // possibly do something here 
    Thread.ResetAbort(); 
} 

但是,這有一個很惡臭味。可能沒有理由去做,所以你可能想重新考慮你的方法。

更新: 有上,這樣處理許多問題與Thread.Abort

This one有我在這裏給出了相同的答案。 This one有一個答案,擴大了「除非克蘇魯正在崛起,否則不要叫Thread.Abort」(我已經把它大大降低爲「惡臭」)。

還有很多其他的。

+1

+1:措辭nit-pick。它可以被捕獲 - 它將被重新拋出。 – Hogan 2011-01-10 21:19:36

+0

@霍根:重寫了一下;現在的意思應該更清楚。 – Jon 2011-01-10 21:21:25

4

ThreadAbortException不能像那樣捕獲。除非調用Thread.ResetAbort();否則它將在catch塊的結尾自動重新生成。

如果您在這裏爲ThreadAbortException創建catch塊,則允許在catch(Exception)塊嘗試處理它的情況下自動重新執行它。

-3

它會被抓住並丟失。你應該只捕捉異常,你可以做一些事情或者你記錄然後重新拋出(用throw;不要拋出new [某個異常];)。

0

如果您想針對不同類型的異常執行特定操作,那麼它會自動生成單獨的catch塊。否則,你可以只使用一個異常捕獲

0

上調用線程Thread.Abort有效地設置一個標誌,這將導致一個ThreadAbortException拋出任何時間碼不處理該異常,也沒有相關的finally塊。在不調用Thread.ResetAbort()的情況下捕獲異常將導致運行時在下一次機會中拋出另一個ThreadAbortException。但是,這種行爲並不完全沒有意義,因爲它會導致所有內部塊都運行到完成狀態,然後可以通過外部異常過濾器塊查看異常。這是否是件好事將取決於應用程序。

相關問題