根据Exception handling for Windows Runtime apps in C# or Visual Basic,MS建议:
“如果您的应用程序崩溃,即使应用程序生命周期状态允许您也不要尝试向用户显示任何描述崩溃详细信息的信息。”
[此建议是针对WinRT应用程序的,似乎没有针对UWP的建议。我认为我们应该一视同仁。]
有人可以解释其背后的原理吗?
MS UWP应用程序确实遵循此规则。我有邮件,翻译器,计算器,商店应用程序,...中止而没有崩溃或重新启动时的任何反馈。
当应用程序完全消失而没有任何提示时,我个人觉得很烦。
在下次启动时显示错误信息的“小沃森”解决方案对我来说很奇怪。两种行为均不符合普通用户的期望
App_UnhandledException有什么问题:
在极少数情况下,应用程序处于无法显示MessageDialog的糟糕状态(我从未体验过)是没有理由不尝试的。
我了解到,在App_UnhandledException中,该应用程序可能处于未定义/易碎的状态,应该最小化此处执行的代码。但是我们已经在这里跟踪了异常,并通过HockeyApp跟踪了它们。为什么不通知用户?
崩溃错误通知是否对用户有用,取决于应用程序和目标受众。对于企业应用程序,我从长期的经验中知道,错误通知(甚至包含深层的技术信息)绝对有帮助。用户通常甚至无需联系支持人员就可以规避问题并继续使用有缺陷的应用程序(而支持人员会自动知道该问题)。面向消费者的应用程序的值(value)值得商bat。我假设许多用户在输入数据后立即看到Arg_OverflowException时将停止输入0作为除数,或者记得在看到http_client异常时记得拔掉电缆调制解调器的电源。
最佳答案
没有说明在UWP应用崩溃时通知用户有关意外异常或显示异常详细信息的技术原因。此类通知是否对最终用户有帮助,取决于应用程序和目标受众。
这是一个代码示例,用于在App.UnhandledExcetion或下一个应用启动时通知用户:
Protected Overrides Async Sub OnLaunched(e As Windows.ApplicationModel.Activation.LaunchActivatedEventArgs)
...
If _notifyUserAboutCrash = NotifyUserAboutCrash.OnNextStart Then
Await ProblemReporter.NotifyLastExToUserIfExisting()
End If
...
End Sub
Private Async Sub App_UnhandledException(sender As Object, e As UnhandledExceptionEventArgs) Handles Me.UnhandledException
If _isAborting Then Return
Dim unhandledEx = New Exception(e.Message, e.Exception)
e.Handled = True
Trace.Error($"Unexpected exception: {unhandledEx.InnerException.ToString}")
Await Trace.CompleteAsync()
Try
ProblemReporter.SaveAsLastException(unhandledEx)
HockeyClient.Current.TrackException(unhandledEx.InnerException)
HockeyClient.Current.Flush()
Catch ex As System.Exception
Trace.Error(ex)
End Try
If _notifyUserAboutCrash = NotifyUserAboutCrash.OnError Then
Await ProblemReporter.NotifyExceptionToUserViaMessageDialogAsync(unhandledEx)
End If
Await ForceAppCrashAsync(unhandledEx)
End Sub
Private Shared Async Function ForceAppCrashAsync(unhandledEx As Exception) As Task
Trace.Fatal("!!! aborting")
Await Trace.CompleteAsync()
_isAborting = True
ExceptionDispatchInfo.Capture(unhandledEx.InnerException).Throw()
End Function
有关完整的代码和一些陷阱,请参阅我的文章Global Error Handling for UWP-Apps。
关于error-handling - 为什么建议在UWP应用崩溃时不显示错误详细信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37928400/