簡體   English   中英

廣泛使用ThreadAbortException

[英]Extensive use of ThreadAbortException

我正在一個舊項目中,該項目在許多方法中都具有此異常處理代碼。

catch(ThreadAbortException e)
{
  ...
}

我在項目Thread.Abort()或Thread.Interrupt()調用中看不到任何地方。 刪除所有這些ThreadAbortException處理是否安全,還是可以采用其他方法。

官方文檔:“調用Abort方法時引發的異常。” 如果您完全確定沒有對Thread.Abort的調用,則最好擦除那些catch塊。

編輯:請注意,您的代碼可能在可能調用Thread.Abort的外部應用程序的上下文中運行。

但這並不重要,因為ThreadAbortException不能真正被處理,因為CLR本身會重新拋出它以盡快殺死線程。

“實際上是的,ThreadAbortException是特殊的。即使您處理它,它也會在try / catch / finally結束時由CLR自動重新拋出。(如注釋中所述,可以使用ResetAbort將其抑制,但是到那時,代碼聞起來像爛魚。)”-請閱讀此問題以獲取更多詳細信息: ThreadAbortException

好吧,如果專門回答您的問題,我會說最好不要刪除這些異常處理程序,因為它們很可能是某些試圖解決問題的開發人員添加的。 而且我認為添加這些處理程序是有原因的,因此,如果您僅刪除此代碼,將來可能會再次出現一些錯誤。

關於ThreadAbordException :我可以確定,不僅可以在調試時通過調用Thread.Abort()方法來拋出它(它可能是VS中的錯誤,我不確定),並且它會迫使程序崩潰默默。 因此,根據這些處理程序內部的內容,開發人員可能試圖解決此類問題。

還請記住,您也可能在單獨的線程中調用第三方庫,Web服務等的方法。 我不確定他們是否可以拋出這樣的異常,但這是一個可能的情況。

項目是否在主線程上運行並啟動后台工作線程? 如果主線程在后台線程運行時退出,則可能在后台線程上發生ThreadAbortedException。

catch語句可以專門處理這種情況,即在后台線程上實際上沒有發生錯誤,其方式與其他異常不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM