为什么';tc#是否支持首次通过异常过滤?

为什么';tc#是否支持首次通过异常过滤?,c#,vb.net,exception,finally,C#,Vb.net,Exception,Finally,注意:这不是 那个问题被问到“是等价物吗?”我知道没有,我想知道为什么 我问这个问题的原因是,我只是刚刚弄清楚它有多重要,这个结论对我来说似乎很奇怪 Microsoft企业库的异常处理块建议我们使用以下模式: catch (Exception x) { if (ExceptionPolicy.HandleException(x, ExceptionPolicies.MyPolicy)) throw; // recover from x somehow } 该策

注意:这不是

那个问题被问到“是等价物吗?”我知道没有,我想知道为什么

我问这个问题的原因是,我只是刚刚弄清楚它有多重要,这个结论对我来说似乎很奇怪

Microsoft企业库的异常处理块建议我们使用以下模式:

catch (Exception x)
{
    if (ExceptionPolicy.HandleException(x, ExceptionPolicies.MyPolicy))
        throw;

    // recover from x somehow
}
该策略是在XML文件中定义的,这意味着如果客户有问题,我们可以修改该策略以帮助跟踪(或者掩盖)问题,从而为他们提供快速解决方案,直到我们正确处理该问题为止——这可能涉及与第三方争论,因为这都是谁的错

这基本上承认了一个简单的事实,即在实际应用程序中,如果没有这样的工具,异常类型的数量及其“可恢复性”状态实际上是不可能管理的

与此同时,微软的CLR团队表示这不是一个选项,事实证明这些人知道他们在说什么!问题是,就在
catch
块运行之前,嵌套在
try
块中的任何
finally
块都将被执行。因此,这些
最终
块可以执行以下任一操作:

  • 无害地修改程序状态(呸,幸运)
  • 在客户的数据中丢弃一些重要的东西,因为程序状态错误到了未知的程度
  • 掩盖或销毁我们需要诊断问题的重要证据——特别是当我们谈论对本机代码的调用时
  • 抛出另一个例外,增加了普遍的混乱和痛苦
请注意,
using
语句和C++/CLI析构函数是基于
try
/
finally
构建的,因此它们也会受到影响

因此,显然用于过滤异常的
catch
/
throw
模式是不好的。实际上需要的是一种通过策略过滤异常的方法,而不是实际捕获异常,从而触发
最后执行
块,除非我们找到一种策略,告诉我们异常可以安全地从中恢复

CLR团队最近在博客上对此进行了讨论:

结果是,我们必须在VB.NET中编写一个helper函数,以允许我们从C#访问这一重要功能。有问题的一个重要线索是,BCL中有这样做的代码。很多人都在博客上写过这样做,但他们很少提到
try
/
finally
blocks,它是杀手

我想知道的是:

  • 在这个问题上,是否有来自C#团队的公开声明或直接电子邮件
  • 是否有任何现有的Microsoft Connect建议要求这样做?我听过关于它们的谣言,但没有一个可能的关键词出现任何东西
更新:如上所述,我已经在Microsoft Connect上搜索过,但没有找到任何内容。我也(毫不奇怪)用谷歌搜索过。我只找到了人,或者指出了,或者徒劳地希望它会是,或者,还有很多。但没有任何关于在所有当前版本的C#中省略它的理由的声明。我询问现有连接问题的原因是:(a)我不会创建不必要的副本,(b)我可以告诉有兴趣的人我是否必须创建一个副本

更新2:发现,以前是C#团队成员:

“是的,能够对 接球比较方便 而不是写测试 你自己,但它并没有真正启用 你需要做任何新的事情。”


这和我之前的假设是一样的,直到我得到了正确的解释

关于第一个问题,如果有一个公开声明,那么它很可能被放到网络上的某个地方,在这种情况下,谷歌应该找到一些东西(如果它存在的话)

如果这是一封与C#团队的直接电子邮件,那么它很可能属于保密协议,因此无论如何都无法发布

关于第二个问题,Microsoft Connect上有一个搜索功能,在输入新建议之前,他们会提示您使用该功能。如果你找不到它,那么可能就没有了


我的建议是加入一个建议,然后推广它,让其他人参与进来。

据我所知,在重新引用时,内部函数中的最终处理程序将被执行,这就是给您带来问题的原因

但是假设您有一个异常过滤器,它通过异常而不实际重新触发它。你仍然需要在某个地方处理它,你会遇到同样的问题(最终影响)

因此,除非我误解了什么,否则使用语言支持的异常过滤器并没有多大好处。

使用可能比使用代理解决方案更简单

要真正回答您的问题,您需要Anders Hejlsberg或参加原始设计会议的人员的回复。你可以试试看下一次第九频道的采访者是否会问你这个问题

我猜当最初的决定做出时,异常过滤器被视为一种不必要的复杂情况,可能弊大于利。在本次访谈中,您当然可以看到对未经验证的功能保持“沉默”的愿望,即决定不支持选中的异常:

我认为postmoterm诊断场景强烈支持使用该语言提供对异常过滤器的访问。然而,当时可能没有阐明这些情景。此外,这些场景确实需要适当的工具支持,这在V1中肯定不可用。最后,添加此功能可能会带来一些我们没有考虑的负面影响

如果有