【问题标题】:What is best practice to handle all Exceptions in WPF application?处理 WPF 应用程序中所有异常的最佳实践是什么?
【发布时间】:2010-11-05 09:45:39
【问题描述】:

有什么方法可以处理 WPF 应用程序中的所有错误异常和崩溃?

我知道DispatcherUnhandledException,但它只处理 UI 线程中的异常,不是吗?

有没有办法捕捉和记录其他线程中的所有异常以及绑定错误?

【问题讨论】:

    标签: wpf error-handling


    【解决方案1】:
    AppDomain.CurrentDomain.UnhandledException
    

    将为当前线程捕获任何未处理的异常。这就是我们在应用程序中处理它的方式。

    BindingErrors 总是被处理并记录到输出窗口。在发布之前,我们会检查输出窗口是否存在绑定错误并尽可能多地修复。

    但是,我认为您不希望将绑定错误视为未处理的,因为它们大多是可以恢复的,应该在每次发布之前尽可能地修复它们。您可以在 Visual Studio 中更改 Debug > Exeptions 以使其抛出 BindingFailure 以获取更具体的信息。

    【讨论】:

    • 哪里是定义事件处理程序以便甚至可以检测到最早的错误的最佳位置?
    • 您可以在应用程序入口点注册事件。有关详细信息,请参阅msdn.microsoft.com/en-us/library/…,因为您需要了解一些事情。
    【解决方案2】:

    请记住,Microsoft 不建议捕获所有异常,而是建议仅捕获您知道(或期望在某个地方发生)的异常。更何况要获得“Certified for Microsoft [Windows|Vista]”标志,千万不能捕获未知异常,此类异常必须到Wer

    【讨论】:

    • 我同意,但是,如果您确实捕获了所有异常,则仅记录它,这样您就可以找到常见的错误并纠正它们。然后再次抛出异常。
    • 我相信你提到的微软建议不是从 try 块中捕获所有异常,即捕获异常。但是,OP 正在寻求一种解决方案来处理未捕获的异常,以便您可以通过通知用户崩溃并向您的开发/QA 团队发送崩溃报告电子邮件来处理这种情况。
    • 不,Microsoft 的建议正是关于捕获所有未处理的异常。 os 将收集所有信息并将报告发送给 MS 的主要思想,因此 MS 将拥有有关问题应用程序的所有统计信息,然后开发人员可以通过 Winqual 从 MS 获取此报告。但是,当然也允许记录一些关于未知异常的日志,然后按照 khebbie 提到的方式重新抛出。
    • 感谢您的澄清。我们不会向 WER 提交错误信息,因为我们的应用程序是内部的。
    【解决方案3】:

    是的,有 3 个地方:

    1. Application.Run() 放入try ... catch
    2. DispatcherUnhandledException
    3. AppDomain.CurrentDomain.UnhandledException

    在任何一种情况下,您都应该显示请原谅我的消息并建议发送错误报告。

    您服务器上的服务应回答“感谢您提交错误报告”或“问题已在下一个版本中修复”。请更新'

    【讨论】:

    • 我认为 WPF 应用程序中不存在 Application.Run()
    • 列出所有地点的好方法。但请确保所有这些都是正确的。
    【解决方案4】:

    这里有一个很好的解决方案,使用 NLog 进行日志记录:

    Logging in .NET with NLog (default config file, catch all exceptions and route to logger, ...)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-21
      • 2013-01-13
      • 2012-03-22
      • 1970-01-01
      • 2022-01-16
      • 2018-01-03
      • 1970-01-01
      • 2011-09-19
      相关资源
      最近更新 更多