共用方式為


System.AppDomain.UnhandledException 事件

本文提供此 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 不會引發 事件。