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