本文提供此 API 參考文件的補充備註。
事件 UnhandledException 會提供未攔截例外狀況的通知。 它可讓應用程式在系統默認處理程式向使用者報告例外狀況並終止應用程式之前記錄例外狀況的相關信息。 如果有足夠的應用程式狀態資訊可供使用,可能會採取其他動作,例如儲存程序數據以供稍後復原。 建議您注意,因為未處理例外狀況時,程序數據可能會損毀。 當擲回例外狀況時,處理程式也會在保留鎖定時執行,因此應該小心避免等待其他可能會造成死結的資源。
此事件可以在任何應用程式域中處理。 不過,事件不一定會在發生例外狀況的應用程式域中引發。 只有當線程的整個堆疊都沒有找到適當的例外狀況處理程式時,例外狀況才會被視為未處理。此時,事件可以被引發的第一個位置是在線程起源的應用程式域中。
如果UnhandledException事件是在預設的應用程式域中處理,則無論線程啟動於哪個應用程式域,任何線程中任何未處理的例外狀況都會在該處被引發。 如果線程是在具有 事件處理程式 UnhandledException的應用程式域中啟動,則會在該應用程式域中引發 事件。 如果該應用程式域不是預設應用程式域,而且預設應用程式域中也有事件處理程式,則會在這兩個應用程式域中引發事件。
例如,假設線程在應用程式域 「AD1」 中啟動、在應用程式域 「AD2」 中呼叫方法,然後從該處呼叫應用程式域 「AD3」 中的方法,其中會擲回例外狀況。 可以引發事件的第一個應用程式域 UnhandledException 是 「AD1」。 如果該應用程式域不是預設應用程式域,也可以在默認應用程式域中引發事件。
注意
Common Language Runtime 在事件的處理程序 UnhandledException 執行期間暫停線程中止。
如果事件處理程式具有 ReliabilityContractAttribute 具有適當旗標的屬性,事件處理程式會被視為限制的執行區域。
從 .NET Framework 4 開始,除非事件處理程式是安全性關鍵且具有 HandleProcessCorruptedStateExceptionsAttribute 屬性,否則不會針對損毀進程狀態的例外狀況引發此事件,例如堆棧溢位或存取違規。
若要註冊此事件的事件處理程式,您必須具有必要的許可權,否則 SecurityException 會擲回 。
如需處理事件的詳細資訊,請參閱 處理和引發事件。
未處理的例外狀況的其他事件
對於某些應用程式模型,如果未處理的例外狀況發生在主要應用程式線程中, UnhandledException 事件可能會優先於其他事件。
在使用 Windows Forms 的應用程式中,主要應用程式線程中未處理的例外狀況會導致 Application.ThreadException 引發事件。 如果處理此事件,預設行為是未處理的例外狀況不會終止應用程式,不過應用程式處於未知狀態。 在此情況下,不會引發 UnhandledException 事件。 您可以使用應用程式組態檔來變更此行為,或在將事件處理程序連結之前,使用 Application.SetUnhandledExceptionMode 方法來將模式變更為 UnhandledExceptionMode.ThrowException 的模式,ThreadException。 這隻適用於主要應用程式線程。 針對其他線程中拋出的未被處理的例外情況,會引發 UnhandledException 事件。
Visual Basic 應用程式架構會針對主要應用程式線程中未處理的例外狀況,提供另一個事件: WindowsFormsApplicationBase.UnhandledException 事件。 此事件具有事件自變數物件,其名稱與 所使用的 AppDomain.UnhandledException事件自變數物件相同,但具有不同的屬性。 特別是,這個事件自變數物件具有 ExitApplication 屬性,可讓應用程式繼續執行,忽略未處理的例外狀況(且讓應用程式處於未知狀態)。 在此情況下,不會引發 AppDomain.UnhandledException 事件。