假设我有一个使用异常来表示成功或失败的库。
当我尝试请求此库的不同属性时,我希望异常被抛出很多次
。现在在.NET中,据说try
不需要任何费用,但catch
可以。 (特殊情况下的例外处理成本)。
有没有办法告诉.NET将成本安装在处理程序中?就像在C ++中一样?
澄清:调用代码'迭代'所有可能的函数参数值:
foreach( var enumvalue in Enum.GetValues( MyEnum ) ) {
try {
libraryObject.libFunction( enumvalue ); // will probably throw...
} catch(ArgumentException) {
}
}
注意:我知道这不是一个很棒的API。它应该被扩展,以便迭代'可能'值,或者使用返回码。我不需要回答这一点。
答案 0 :(得分:2)
我认为没有办法在.net中使例外便宜。它们建立在结构化异常处理的基础上,而且价格昂如此简短的重写.net运行时,我无法想到任何可以使异常处理变得便宜的东西。可能它在64位系统上要快一些,因为SEH的工作方式不同。
正确的解决方案是重构抛出异常的API,使其不经常抛出。例如,通过返回状态代码。如果他们是第三方代码,你无法改变,那么我不知道如何提高你的表现。
或者您可以编写类似于抛出异常的代码,该代码预先检测错误条件。因此,如果您知道它将抛出,则不再调用API。虽然这违反了DRY,但使用第三方代码时,这可能仍然是唯一可行的解决方案。