是否存在抛出异常并立即捕获的开销? 这个
之间有区别吗?void DoSomething(object basic)
{
try
{
if (basic == null)
throw new NullReferenceException("Any message");
else
{
//...
}
}
catch (Exception error)
{
_logger.WriteLog(error);
}
}
和这(这里我们不抛出异常):
void DoSomething(object basic)
{
try
{
if (basic == null)
{
_logger.WriteLog(new NullReferenceException("Any message");
return;
}
else
{
...
}
}
catch (Exception error)
{
_logger.WriteLog(error);
}
}
第二个片段是否会更快?
此外,我想知道为什么一个解决方案比另一个更快。
答案 0 :(得分:4)
异常比所有其他程序流程慢,但由于性能原因应避免使用它们。但是,它们并不适用于程序流程。在您的情况下,您有一个非常有效的替代方案,它比使用异常更好。当您可以预测情况并适当地处理它而没有例外时,请始终这样做。另外,为方便起见,请不要在正常的程序流程中使用异常。
当您遇到无法直接处理的意外情况时,请使用例外。
答案 1 :(得分:0)
我认为Throw比try / catch有更多的开销。我的意思是说有一个try / catch几乎没有开销,但是一旦你真正需要捕获异常就会有一个小的开销。 在很多程序中,你显示的两个选项都没问题,但是如果你试图真正地描述你的代码,没有抛出它会更快。 还有一些值得关注的问题:
Under C# how much of a performance hit is a try, throw and catch block
答案 2 :(得分:0)
在这种情况下,我认为第二种选择更快,但是 如上所述 @Samuel Neff 异常非常缓慢。然而,当我阅读关于异常的 Jon Skeet arcticle时,我发现了一个有趣的 Krzysztof Cwalina :Design Guidelines Update: Exception Throwing.,这解释了我们何时应该和不应该使用例外。 事实上,我发现了一个重要的观点:
1.2例外与表现:
与例外有关的一个共同问题是如果有例外 用于常规失败的代码,性能 实施将是不可接受的。这是一个非常有效的问题。 当成员抛出异常时,其性能可以是 幅度较慢。但是,可以实现良好的性能 同时严格遵守不允许的例外准则 使用错误代码。本节中描述的两种模式提供了方法 去做这个。
- 不要使用错误代码,因为担心异常可能会对性能产生负面影响。