Share via


Application.UnhandledException 事件

定義

發生于應用程式程式碼可以處理例外狀況時,如從原生層級Windows 執行階段錯誤轉送。 應用程式可以將發生次數標示為事件資料中已處理。

public:
 virtual event UnhandledExceptionEventHandler ^ UnhandledException;
// Register
event_token UnhandledException(UnhandledExceptionEventHandler const& handler) const;

// Revoke with event_token
void UnhandledException(event_token const* cookie) const;

// Revoke with event_revoker
Application::UnhandledException_revoker UnhandledException(auto_revoke_t, UnhandledExceptionEventHandler const& handler) const;
public event UnhandledExceptionEventHandler UnhandledException;
function onUnhandledException(eventArgs) { /* Your code */ }
application.addEventListener("unhandledexception", onUnhandledException);
application.removeEventListener("unhandledexception", onUnhandledException);
- or -
application.onunhandledexception = onUnhandledException;
Public Custom Event UnhandledException As UnhandledExceptionEventHandler 

事件類型

備註

事件 UnhandledException 可用來通知應用程式 XAML 架構或一般Windows 執行階段未由應用程式程式碼處理的例外狀況。

例如,如果Windows 執行階段叫用類似事件處理常式的應用程式程式碼,而應用程式程式碼會擲回例外狀況,而且不會攔截它,則例外狀況會傳播回Windows 執行階段。 Windows 執行階段接著會引發 UnhandledException 事件,以通知應用程式發生此例外狀況。

處理 中的 UnhandledException 例外狀況只是許多技術之一,可用於偵錯和執行時間例外狀況處理和可能的復原。 如需可用於偵錯和錯誤處理之一組完整技術的詳細資訊,請參閱例外狀況 處理 (C# 程式設計手冊)

請注意,只有當應用程式程式碼無法再攔截例外狀況時,才會引發此事件。 例如,假設應用程式事件處理常式會呼叫Windows 執行階段 API,進而叫用回呼。 如果內部應用程式程式碼擲回例外狀況,但不會攔截例外狀況,例外狀況會透過Windows 執行階段傳播回應用程式程式碼的外部層,而有機會攔截它。 UnhandledException只有當應用程式程式碼無法再透過一般傳播攔截例外狀況時,才會引發事件。

也可能擲回例外狀況,且永遠不會有應用程式程式碼攔截到的任何機會。 例如,如果 XAML 架構正在執行版面配置並擲回例外狀況,此例外狀況將不會透過任何應用程式程式碼傳播。 在此情況下,事件 UnhandledException 會引發,而這會是第一次收到任何應用程式程式碼的例外狀況通知。

一般來說, UnhandledException 引發事件之後,Windows 執行階段會因為未處理例外狀況而終止應用程式。 應用程式程式碼對此有一些控制權:如果事件處理常式將 UnhandledException 事件引數的 Handled 屬性設定為 true ,則在大多數情況下,不會終止應用程式。 不過,基於數個原因,不建議定期執行此動作:

  • 事件處理常式通常 UnhandledException 沒有足夠的資訊可知道例外狀況安全之後是否繼續執行。 應用程式程式碼或Windows 執行階段部分可能處於不一致的狀態,如果應用程式繼續執行其程式碼,可能會導致後續失敗。
  • Windows 執行階段會將某些作業期間發生的例外狀況視為不可復原,因為Windows 執行階段本身會處於這些例外狀況之後不一致的狀態。 針對這類例外狀況,即使事件處理常式將 UnhandledExceptionHandled 設定為 true ,應用程式仍會終止。
  • 在流覽期間發生的錯誤可能會導致沒有任何內容載入的狀態,而且不會向使用者指出應用程式仍在執行中。
  • 如需這些點的詳細資訊,請參閱 C# 程式設計手冊 (例外狀況處理)

值得注意的限制是 UnhandledException 事件引數不會包含與從應用程式程式碼傳播的原始例外狀況相同的詳細資料。 可能的話,如果應用程式需要特定例外狀況的特定處理,最好在例外狀況傳播時攔截例外狀況,因為接著會提供更多詳細資料。 事件 UnhandledException 引數會透過 Exception 屬性公開 例外 狀況物件。 不過,此例外狀況物件的類型、訊息和堆疊追蹤不保證符合引發的原始例外狀況。 事件引數確實會公開 Message 屬性。 在大部分情況下,這將會包含最初引發之例外狀況的訊息。

您無法在 App.xaml) 的Application元素上,在 XAML (中連接 的處理常式 UnhandledException 。 您必須在程式碼的Application物件上附加 處理常式 UnhandledException ,不論是在建構函式或啟用邏輯中。

適用於

另請參閱