如何使用Application_UnhandledException来捕获常规异常?

时间:2014-09-22 18:36:12

标签: c# windows windows-phone-8 visual-studio-2013 windows-phone

我问的问题很简单,但我确信我在这里遗漏了一些东西:D

我的App.xaml.cs文件中有以下方法:

private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
    MessageBox.Show("An error occurred!", ":(", MessageBoxButton.OK);
    e.Handled = true;
    App.Current.Terminate;
}

并且在App()方法中添加了eventHandler:

public App()
{
    UnhandledException += Application_UnhandledException;

    //InitializeComponent() etc...
}

现在,我在MainPage.xaml.cs文件的一个方法中添加了几行生成IndexOutOfRange异常的行,如:

int[] stuff = new int[3];
for (int i = 0; i < 4; i++)
{
    stuff[i] = 0;
}

我不明白Application_UnhandledException方法是如何工作的,因为当我尝试运行它时,我在Visual Studio调试器中得到IndexOutOfRange异常,但随后应用程序崩溃,我没有得到该消息框,所以Application_UnhandledException中的代码根本不运行。 那是为什么?

有没有办法添加一个事件处理程序,触发我得到的任何异常? 我的意思是,使用IndexOutOfRande,使用KeyNotFound等等......

谢谢! :)

2 个答案:

答案 0 :(得分:1)

您的消息框未显示,因为它之后会关闭应用程序。

如果您想要停止此行为,则需要以下代码:

e.Handled = true;

然而,如上所述,继续执行应用程序可能会导致更多问题。因此,我只会将此用于收集崩溃信息的情况,可能会向用户道歉,然后使用App.Current.Terminate();

退出应用程序

答案 1 :(得分:0)

在Musters链接的documentation中说明了以下内容:

  

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

     
    

•通常,UnhandledException事件处理程序没有足够的信息     知道在例外是否安全后继续。部分内容     应用程序代码或Windows运行时可能不一致     状态,如果应用程序继续,可能导致后续失败     运行它的代码。

         

•Windows运行时考虑异常     在某些操作中遇到不可恢复的,因为     Windows运行时本身将处于不一致的状态     这些例外。对于此类异常,即使出现UnhandledException     事件处理程序设置Handled为true,应用程序仍将被终止。

         

•导航期间发生的错误可能会导致状态     没有任何东西作为内容加载,也没有任何东西可以指示给用户     该应用仍在运行。