3

所以我们的应用程序有一个很好的中央异常处理程序,其中记录了异常的详细信息,向用户显示通用窗口,并且以一种很好的优雅方式关闭。但是,我们现在有一个第 3 方组件,它不时(并且可能出于完全正当的原因)调用 Environment.FailFast。这将我们的应用程序从水中吹了出来,对我们的用户来说看起来很糟糕。有什么方法可以优雅地处理 Environment.FailFast 吗?

4

2 回答 2

4

我看不到方法,根据 MSDN 中的各种条目,这是该过程的硬终止。您为处理此问题而创建的任何代码都将驻留在进程中。它也不会运行 finally 块或任何挂起的终结器,所以我猜它不会提供任何事件或挂钩以允许自定义代码运行。在某种程度上,这是有道理的,否则它可能不会“快速”失败,并且它主张仅在极端进程损坏的情况下使用。

http://msdn.microsoft.com/en-us/library/dd289241

我看到两个三个选项:

  1. 向供应商发送请求以更改代码并删除此调用。
  2. 寻找新的供应商。
  3. 正如@RB 所建议的那样。将此 DLL 的使用集中到一个新进程中,以便核心应用程序进程保持安全。我这样做过一次,非常头痛,但“它有效”。如果您不能使用建议 1 或 2,我只会建议您这样做!

引用 MSDN:

此方法在不运行任何活动的 try/finally 块或终结器的情况下终止进程。

FailFast 方法将消息字符串写入 Windows 应用程序事件日志,创建应用程序的转储,然后终止当前进程。消息字符串也包含在向 Microsoft 报告的错误中。

如果应用程序的状态已损坏无法修复,则使用 FailFast 方法而不是 Exit 方法来终止应用程序,并且执行应用程序的 try/finally 块和终结器将损坏程序资源。

于 2012-05-25T15:09:57.927 回答
2

您可以在新进程中执行第 3 方代码。

一种简单的方法是将第 3 方代码包装在可执行文件中,然后使用Process.Start启动它。

请注意,我找不到文档,FailFast 之后的错误级别是什么。当我测试它时,我得到的价值是-2146232797......

于 2012-05-25T15:17:48.607 回答