为什么建议不要(!)在UWP应用程序崩溃时显示错误详细信息?

时间:2016-06-20 17:25:51

标签: error-handling uwp

根据Exception handling for Windows Runtime apps in C# or Visual Basic MS建议:

"如果您的应用程序崩溃,请不要尝试向用户显示描述崩溃细节的任何信息,即使应用程序生命周期状态允许您这样做。"

[此推荐适用于WinRT应用,似乎不建议使用UWP。我认为我们应该对待它们。]

有人可以解释这背后的理由吗?

MS UWP应用程序确实遵循此规则。我有邮件,翻译,计算器,商店应用程序,...中止没有任何关于崩溃或重启的反馈。

我个人觉得应用程序在没有任何提示的情况下消失就很烦人。 "小沃森"在下一次启动时显示错误信息的解决方案对我来说很奇怪。这两种行为都不符合普通用户期望

App_UnhandledException有什么问题:

  • 显示包含错误详细信息的MessageDialog,
  • 然后重新抛出异常以强制应用程序崩溃?

应用程序处于如此糟糕的状态且无法显示MessageDialog(我从未体验过)的极少数情况下没有理由不尝试。

据我所知,在App_UnhandledException中,app可能处于未定义/脆弱状态,应该最小化此处执行的代码。但是我们已经在这里跟踪异常并通过HockeyApp跟踪它们。为什么不通知用户?

如果崩溃错误通知对用户有帮助,则取决于应用和目标受众。对于企业应用程序,我从长期经验中知道错误通知(即使有深入的技术信息)肯定是有帮助的。用户通常能够绕过问题并继续使用有缺陷的应用程序,甚至无需联系支持(同时支持自动意识到问题)。面向消费者的应用程序的价值是有争议的。我假设许多用户在输入数据后立即看到Arg_OverflowException时会停止输入0作为除数,或者在看到http_client异常时记得拔掉了他们的电缆调制解调器。

1 个答案:

答案 0 :(得分:0)

没有任何技术原因反对在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