【问题标题】:Why isn't my exception being caught为什么我的异常没有被捕获
【发布时间】:2010-11-16 11:52:33
【问题描述】:

我有一个混合了 Winforms 和 WPF 的应用程序。在 Winforms 中,我有一个全局异常处理程序,定义如下:

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Application.ThreadException += Application_ThreadException;

这总是在我的应用程序中的任何地方捕获异常,这些异常发生在预期之外并没有得到妥善处理。

对于 WPF,我似乎能够捕捉到的是:

 wpfAppDomain = new System.Windows.Application();
 wpfAppDomain.DispatcherUnhandledException +=
         wpfAppDomain_DispatcherUnhandledException;

这并不总能捕获全局异常,我经常发现异常在某处被吞没了,我不知道为什么。

如何为 WPF 创建一个全局异常处理程序,以捕获发生的任何未处理的异常?

【问题讨论】:

  • 您是在 Visual Studio 中还是在可执行文件上进行测试? Visual Studio 将尝试捕获一些异常并中断您的应用程序执行。
  • 谁抛出了这个异常?如果 John Skeet 做到了,你就抓不住它;)
  • 我永远不会试图从伟大而强大的 John Skeet 那里捕捉任何异常。
  • @Zyphrax,如果我幸运的话,在某些情况下 VS 会显示异常,但可执行文件很少这样做。我有全局异常处理,所以如果出现问题,我可以提示用户提供一些详细信息,然后向我报告血腥的堆栈跟踪,而不会让用户遇到粗鲁的应用程序崩溃。

标签: c# wpf winforms .net-3.5 exception-handling


【解决方案1】:

在某些情况下,此代码不会捕获异常,而是有意这样做

  • 异常是无法捕获的。例如运行时抛出 StackOverflowException
  • 异常在您的代码中未处理,但在核心 WPF 框架中被捕获。

没有办法捕获所有抛出的异常。这样做将允许您违反应该始终有效的代码语义。

【讨论】:

  • 我了解并非所有内容都可以捕获,也不应该如此,但 SQL 异常就是一个很好的例子。 winform 代码捕获了所有这些,但 WPF 似乎吞下了它们。
【解决方案2】:

您在致电SetUnhandledExceptionMode 后尝试过吗?像这样:

// Force all exceptions through our handler.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

【讨论】:

    【解决方案3】:

    DispatcherUnhandledException 仅从调度程序调用的代码中捕获异常(顾名思义),它应该捕获从 WPF 代码调用时抛出的异常。

    不包括以下引发的异常:WinForms、BackgroundWorker、线程池或您自己启动的线程。

    您仍然可以使用 AppDomain.CurrentDomain.UnhandledException 来捕获这些。

    【讨论】:

      猜你喜欢
      • 2012-01-22
      • 1970-01-01
      • 2020-11-16
      • 2010-11-25
      • 2012-02-24
      • 2017-06-18
      • 1970-01-01
      相关资源
      最近更新 更多