异常处理。捕获多长时间?

时间:2012-09-10 13:56:49

标签: c# exception exception-handling

  

可能重复:
  How slow are .NET exceptions?

是否存在抛出异常并立即捕获的开销? 这个

之间有区别吗?
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);
    }
}

第二个片段是否会更快?

此外,我想知道为什么一个解决方案比另一个更快。

3 个答案:

答案 0 :(得分:4)

异常比所有其他程序流程慢,但由于性能原因应避免使用它们。但是,它们并不适用于程序流程。在您的情况下,您有一个非常有效的替代方案,它比使用异常更好。当您可以预测情况并适当地处理它而没有例外时,请始终这样做。另外,为方便起见,请不要在正常的程序流程中使用异常。

当您遇到无法直接处理的意外情况时,请使用例外。

答案 1 :(得分:0)

我认为Throw比try / catch有更多的开销。我的意思是说有一个try / catch几乎没有开销,但是一旦你真正需要捕获异常就会有一个小的开销。 在很多程序中,你显示的两个选项都没问题,但是如果你试图真正地描述你的代码,没有抛出它会更快。  还有一些值得关注的问题:

Under C# how much of a performance hit is a try, throw and catch block

What is the real overhead of try/catch in C#?

答案 2 :(得分:0)

在这种情况下,我认为第二种选择更快,但是 如上所述 @Samuel Neff 异常非常缓慢。然而,当我阅读关于异常的 Jon Skeet arcticle时,我发现了一个有趣的 Krzysztof Cwalina Design Guidelines Update: Exception Throwing.,这解释了我们何时应该和不应该使用例外。 事实上,我发现了一个重要的观点:

1.2例外与表现

  

与例外有关的一个共同问题是如果有例外   用于常规失败的代码,性能   实施将是不可接受的。这是一个非常有效的问题。   当成员抛出异常时,其性能可以是   幅度较慢。但是,可以实现良好的性能   同时严格遵守不允许的例外准则   使用错误代码。本节中描述的两种模式提供了方法   去做这个。

     
      
  • 不要使用错误代码,因为担心异常可能会对性能产生负面影响。
  •