所以我们的应用程序有一个很好的中央异常处理程序,其中记录了异常的详细信息,向用户显示通用窗口,并且以一种很好的优雅方式关闭。但是,我们现在有一个第 3 方组件,它不时(并且可能出于完全正当的原因)调用 Environment.FailFast。这将我们的应用程序从水中吹了出来,对我们的用户来说看起来很糟糕。有什么方法可以优雅地处理 Environment.FailFast 吗?
2 回答
我看不到方法,根据 MSDN 中的各种条目,这是该过程的硬终止。您为处理此问题而创建的任何代码都将驻留在进程中。它也不会运行 finally 块或任何挂起的终结器,所以我猜它不会提供任何事件或挂钩以允许自定义代码运行。在某种程度上,这是有道理的,否则它可能不会“快速”失败,并且它主张仅在极端进程损坏的情况下使用。
http://msdn.microsoft.com/en-us/library/dd289241
我看到两个三个选项:
- 向供应商发送请求以更改代码并删除此调用。
- 寻找新的供应商。
- 正如@RB 所建议的那样。将此 DLL 的使用集中到一个新进程中,以便核心应用程序进程保持安全。我这样做过一次,非常头痛,但“它有效”。如果您不能使用建议 1 或 2,我只会建议您这样做!
引用 MSDN:
此方法在不运行任何活动的 try/finally 块或终结器的情况下终止进程。
FailFast 方法将消息字符串写入 Windows 应用程序事件日志,创建应用程序的转储,然后终止当前进程。消息字符串也包含在向 Microsoft 报告的错误中。
如果应用程序的状态已损坏无法修复,则使用 FailFast 方法而不是 Exit 方法来终止应用程序,并且执行应用程序的 try/finally 块和终结器将损坏程序资源。
您可以在新进程中执行第 3 方代码。
一种简单的方法是将第 3 方代码包装在可执行文件中,然后使用Process.Start启动它。
请注意,我找不到文档,FailFast 之后的错误级别是什么。当我测试它时,我得到的价值是-2146232797
......