【问题标题】:Catch unhandled exceptions from editor从编辑器中捕获未处理的异常
【发布时间】:2015-02-16 13:41:16
【问题描述】:

我们在 WPF 应用程序 (MVVM) 中使用 MEF 来嵌入外部编辑器。在我们的主视图中,有一个内容元素将放置在其中。

现在我们想从该编辑器中捕获任何未处理的异常,然后重新加载该编辑器。我唯一发现的是使用Application 类中的DispatcherUnhandledException。从那里我必须以某种方式到达主视图编辑器并告诉它重新加载崩溃的编辑器。

我想知道是否有一个“较低”级别的点,我可以在哪里捕获异常?有没有人有这方面的经验并且可以在这里帮助他?

谢谢

【问题讨论】:

  • 在启动编辑器的代码周围添加一个try/catch 块怎么样?
  • 编辑器没有“启动”,它通过 IOC 嵌入到 xaml 容器中。所以它基本上只是我们主窗口中的另一个控件,我不知道如何将它包装到 try/catch 块中
  • 您也可以使用AppDomain.UnhandledException Event 来捕获未处理的Exceptions,尽管这发生在应用程序关闭之前,所以我不认为该事件是对你也有用。
  • 是的,我也发现了这一点,但由于它与DispatcherUnhandledException 几乎处于同一水平,它也无济于事:(

标签: c# wpf editor mef unhandled-exception


【解决方案1】:

所以我的回答是:如果可以的话,你最好不要这样做。当您收到未处理的异常时,您的应用程序将不再处于稳定状态。你究竟会恢复到哪里?如果您的外部编辑器抛出像 AccessViolationExceptionOutOfMemoryException 这样的损坏状态异常(例如 Win32 SEH 异常)怎么办?此时您的整个应用程序可能处于未确定状态,因此进一步执行可能会导致数据丢失和/或损坏。此外,CLR 可能无法保证您的应用可以继续运行:

SEH 异常与由 你的程序。程序可能会引发异常,因为它试图 从空堆栈中弹出一个项目或试图打开一个没有 存在。所有这些例外都在您的上下文中有意义 程序的执行。 SEH 异常是指您的上下文之外的上下文 程序。与程序错误不同,SEH 异常表明 运行时进程的完整性可能已受到损害。

请阅读SEH and CLR exceptions here

以下是我不建议您执行的操作,而是为了您的信息:您可以通过更新 app.config 文件来阻止您的应用在捕获未处理的异常后关闭: p>

<runtime>
  <!-- the following setting prevents the host from closing when an unhandled exception is thrown -->
  <legacyUnhandledExceptionPolicy enabled="1" />
</runtime>

但是,正如微软所说,如果你忽略异常,应用程序可能会泄漏资源并放弃锁。

【讨论】:

  • 好吧,我想,因为我们的应用程序编辑器完全独立于我们的应用程序(从组装的角度来看),我想,这可能不是什么大问题。这个想法是处理编辑器并从打开编辑器时开始使用备份数据重新加载它。所以所有的变化都会被处理掉。但我明白你的意思,你不能确定未处理的异常对托管应用程序的影响
  • @derape,问题是,即使您的编辑器或外部编辑器位于不同的程序集中,它们仍然在一个执行环境中运行,甚至可能在一个应用程序域中运行。因此,外部编辑器将使用与您自己的 UI 元素相同的 UI 线程。因此,“崩溃”该线程会导致整个应用程序不稳定,而不仅仅是“他们的编辑器程序集”。
猜你喜欢
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
  • 2017-05-08
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多