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# 或 Visual Basic 中的 异常处理

请注意,仅当应用代码不再可能捕获异常时,才会触发此事件。 例如,假设应用事件处理程序调用Windows 运行时 API,而该 API 又调用回调。 如果内部应用代码引发异常但未捕获它,则异常将通过Windows 运行时传播回应用代码的外部层,应用代码的外部层将有机会捕获它。 仅当应用代码不再有机会通过正常传播捕获异常时,才会触发 UnhandledException 事件。

也可能引发异常,并且永远不会有任何机会被应用代码捕获。 例如,如果 XAML 框架正在执行布局并引发异常,则此异常不会通过任何应用代码传播。 在这种情况下,将触发 UnhandledException 事件,这是首次向任何应用代码发出异常通知。

通常,在触发 UnhandledException 事件后,Windows 运行时终止应用,因为异常未处理。 应用代码对此有一些控制:如果 UnhandledException 事件处理程序将事件参数的 Handled 属性设置为 true,则在大多数情况下,应用不会终止。 但是,出于以下几个原因,不建议定期这样做:

  • 通常,UnhandledException 事件处理程序没有足够的信息来知道在异常后继续操作是否安全。 部分应用程序代码或Windows 运行时可能处于不一致状态,如果应用继续运行其代码,可能会导致后续失败。
  • Windows 运行时将某些操作期间遇到的异常视为不可恢复,因为在发生这些异常后,Windows 运行时本身将处于不一致状态。 对于此类异常,即使 UnhandledException 事件处理程序将 Handled 设置为 true,应用仍将终止。
  • 导航期间发生的错误可能会导致一种状态,其中没有任何内容加载,也没有向用户指示应用仍在运行。
  • 有关这些点的详细信息,请参阅 C# 或 Visual Basic 中的 异常处理

一个值得注意的限制是 UnhandledException 事件参数包含的详细信息不如从应用代码传播的原始异常多。 如果应用需要特定异常的特定处理,只要可能,最好在异常传播时捕获该异常,因为届时将提供更多详细信息。 UnhandledException 事件参数通过 Exception 属性公开 异常 对象。 但是,无法保证此异常对象的类型、消息和堆栈跟踪与引发的原始异常相匹配。 事件参数会公开 Message 属性。 在大多数情况下,这将包含最初引发的异常的消息。

无法在 App.xaml) 的 Application 元素上连接 XAML (UnhandledException 的处理程序。 必须在代码中的 Application 对象上附加 UnhandledException 的处理程序,无论是在构造函数中还是在激活逻辑中。

对于Windows 8.1应用,异步方法调用的异常可以作为 UnhandledException 事件传播。 这包括你自己的异步方法实现 (激活处理程序等) 。

适用于

另请参阅