1

在我的 Windows Phone 应用程序中,我Application.UnhandledException用来捕获所有未处理的错误。如果发生这种错误,那么我的应用程序会显示一个简单MessageBox的请求,要求通过电子邮件向开发人员发送错误报告。它看起来像这样:

protected virtual void OnUnhandledException(
    object sender, ApplicationUnhandledExceptionEventArgs e)
{
    Deployment.Current.Dispatcher.BeginInvoke(() =>
        {
            var result = MessageBox.Show(
                "Would you like to send a report to developers?", 
                "Error", 
                MessageBoxButton.OKCancel);

            if (result == MessageBoxResult.OK)
            {
                var task = new EmailComposeTask();
                task.To = "feedback@site.com";
                task.Subject = "Error";
                task.Body = 
                    e.ExceptionObject + "\n" + e.ExceptionObject.StackTrace;
                task.Show();

                e.Handled = true;
            }
        });
}

在大多数情况下,一切正常。

但许多用户抱怨说,有时应用程序只是崩溃而没有消息。我的开发人员仪表板中有一些崩溃报告,但这些报告中的有用信息非常少。而且我不明白什么样的错误会导致这种情况。我只假设在一个后台线程中发生了一些错误。

Application.UnhandledException在所有情况下都能正常工作吗?一些异常是否可以不处理?在上述情况下可以做什么?

谢谢。

4

3 回答 3

5

除了其他答案中的要点外,您不能保证 Dispatcher 仍在运行或 UI 线程将再次执行。

当然,如果应用程序或操作系统处于错误状态(尤其是 OutOfMemory),几乎任何尝试都可能失败。因此,您做得越少越好 - 这样您就不会弄乱手机收集并上传到商店的崩溃报告。

IsolatedStorage相反,您应该在下次启动应用程序时将异常详细信息写入并检测过去异常的存在。

于 2013-08-02T20:16:21.430 回答
2

Application.UnhandledException,AFAIK 中未报告工作线程中的未处理异常或由 Task 调度的异常。

阅读以下内容:http: //www.markermetro.com/2013/01/technical/handling-unhandled-exceptions-with-asyncawait-on-windows-8-and-windows-phone-8/,似乎是确保您可以在异步代码中捕获那些未处理的好方法。

于 2013-08-02T14:59:13.253 回答
1

并非所有异常都可以处理。基本上,所有可能危及运行时稳定性的异常都不会被处理。根据我的经验,最常见的是 OutOfMemoryException。

于 2013-08-02T14:29:24.507 回答