error-handling - 为什么建议在UWP应用崩溃时不显示错误详细信息?

标签 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中,该应用程序可能处于未定义/易碎的状态,应该最小化此处执行的代码。但是我们已经在这里跟踪了异常,并通过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/

    相关文章:

    c# - 如何在 Windows 10 通用应用程序中切换到后置摄像头

    google-apps-script - 调用 Drive.Files.get(fileId,{alt : 'media' }) in Google apps script (Google Drive API/REST V2)

    r - ggplot错误: cannot coerce class “c(” gg“,”ggplot“)” to a data.frame

    c# - 当 AcceptsReturn 为真时,如何使用 TextBox 处理 Ctrl + Enter?

    c# - 是否可以在 Azure 上运行 .Net UWP 类库?

    c# - 如何在 UWP 应用中检测游戏 Controller 按钮按下 (ABXY)

    windows-mobile - UWP/Windows 10 移动版中的 System.Threading.Thread 替换

    python - 运行时错误 : CUDA out of memory. 试图分配

    cakephp - 自定义错误页面未显示

    javascript - 我似乎不知道如何修复我的 javascript 中的两个 lints。有人可以帮我理解吗?