在我的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;
}
});
}
在大多数情况下,一切正常。
但许多用户抱怨说,有时应用程序只是崩溃而没有消息。我的developer's dashboard中有一些崩溃报告,但这些报告只有非常少量的有用信息。我无法理解什么样的错误会导致这种情况。我只假设某个后台线程中发生了一些错误。
Application.UnhandledException
在所有情况下都能正常运作吗?一些例外是否仍然未得到处理?在上述情况下可以做些什么?
感谢。
答案 0 :(得分:5)
除了其他答案中的要点之外,您无法保证Dispatcher仍在运行或者UI线程将再次执行。
当然,如果应用程序或操作系统处于不良状态(特别是使用OutOfMemory),任何做任何事情的尝试都可能失败。所以越少越好 - 这样你就不会搞砸手机收集并上传到商店的崩溃报告。
您应该将异常详细信息写入IsolatedStorage
,并在下次启动应用时检测是否存在过去的异常。
答案 1 :(得分:2)
Application.UnhandledException,AFAIK中未报告工作线程中的未处理异常或Task调度的异常。
请仔细阅读:http://www.markermetro.com/2013/01/technical/handling-unhandled-exceptions-with-asyncawait-on-windows-8-and-windows-phone-8/,似乎有一种很好的方法可以确保您可以捕获异步代码中未处理的内容。
答案 2 :(得分:1)
并非所有例外都可以处理。基本上,不会处理可能危及运行时稳定性的所有异常。根据我的经验,最常见的是OutOfMemoryException。