.NET例外:优化特殊情况

时间:2011-06-16 10:33:52

标签: .net exception optimization

假设我有一个使用异常来表示成功或失败的库。

当我尝试请求此库的不同属性时,我希望异常被抛出很多次

现在在.NET中,据说try不需要任何费用,但catch可以。 (特殊情况下的例外处理成本)。

有没有办法告诉.NET将成本安装在处理程序中?就像在C ++中一样?

澄清:调用代码'迭代'所有可能的函数参数值:

foreach( var enumvalue in Enum.GetValues( MyEnum ) ) {
   try {
      libraryObject.libFunction( enumvalue ); // will probably throw...
   } catch(ArgumentException) {
   }
}

注意:我知道这不是一个很棒的API。它应该被扩展,以便迭代'可能'值,或者使用返回码。我不需要回答这一点。

1 个答案:

答案 0 :(得分:2)

我认为没有办法在.net中使例外便宜。它们建立在结构化异常处理的基础上,而且价格昂如此简短的重写.net运行时,我无法想到任何可以使异常处理变得便宜的东西。可能它在64位系统上要快一些,因为SEH的工作方式不同。

正确的解决方案是重构抛出异常的API,使其不经常抛出。例如,通过返回状态代码。如果他们是第三方代码,你无法改变,那么我不知道如何提高你的表现。

或者您可以编写类似于抛出异常的代码,该代码预先检测错误条件。因此,如果您知道它将抛出,则不再调用API。虽然这违反了DRY,但使用第三方代码时,这可能仍然是唯一可行的解​​决方案。