受控執行緒中的例外狀況

通用語言執行平台允許執行緒中大多數未處理的例外狀況自然地繼續。 在大多數情況下,這表示未處理的例外狀況導致應用程式終止。 不過,通用語言執行平台針對用於控制程式流程的特定未處理例外狀況提供了防護網:

  • 因為呼叫了 Abort,而導致執行緒中擲回 ThreadAbortException。 這只適用於 .NET Framework 應用程式。

  • 因為正在卸載執行緒執行所在的應用程式定義域,而在執行緒中擲回 AppDomainUnloadedException

  • 通用語言執行平台或主機處理序會藉由擲回內部例外狀況來終止執行緒。

如果在通用語言執行平台所建立的執行緒中有上述任何未處理的例外狀況,則此例外狀況會終止執行緒,但通用語言執行平台不允許例外狀況進一步繼續作業。

如果未在主要執行緒中,或在從 Unmanaged 程式碼進入執行平台的執行緒中處理這些例外狀況,這些例外狀況會正常進行,而導致應用程式終止。

注意

在任何 Managed 程式碼有機會安裝例外狀況處理常式之前,執行平台可能會擲回未處理的例外狀況。 即使 Managed 程式碼沒有機會處理這類例外狀況,但允許例外狀況自然地進行。

開發期間的公開執行緒問題

若允許執行緒以無訊息模式失敗,而不終止應用程式,則可能偵測不到嚴重的程式設計問題。 這是長時間執行的服務和其他應用程式特有的問題。 因為執行緒失敗,所以程式狀態會逐漸變差。 應用程式效能可能會降低,或應用程式可能會停止回應。

允許執行緒中的未處理例外狀況自然地進行,直到作業系統終止程式,公開開發和測試期間的這類問題為止。 程式終止的錯誤報告可支援偵錯。

主機覆寫

非受控主機可以使用裝載 API 中的 ICLRPolicyManager 介面,覆寫通用語言執行平台的預設未處理例外狀況原則。 Iclrpolicymanager:: Setunhandledexceptionpolicy 函數用來設定未處理例外狀況的原則。

另請參閱