2012-09-10 27 views
5

可能重复:
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); 
    } 
} 

将第二个片段是快,还是没有?

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

+0

(new NullReferenceException(“Any message”);)这是我的错字。 –

+2

你可以随时编辑你的问题来修复它(点击编辑链接) – dasblinkenlight

+0

如果你想知道哪个更快,并且你已经有两个有效的代码片断,为什么不运行两个(几千次)并找到为自己? – Servy

回答

4

例外的是比其他所有的程序流程速度较慢,但​​不会给他们的程度,应避免对性能方面的原因。但是,它们并不打算用于程序流程。在你的情况下,你有一个非常有效的选择,比使用例外更好。当你可以预测情况并且无例外地适当处理时,一定要这样做。另外,为了方便,不要在正常的程序流程中使用异常。

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

+0

谢谢。我在项目中找到的第一个片段,我认为,最好不要抛出异常并在此处询问。 –

+0

对于使用try finally finally程序流程,在放置try try块时,以及finally块中必须执行的常规代码,放置哪些内容时,您有什么想法? –

+0

@DaniilGrankin,'try' /'finally'实际上是运行代码的重要构造,通常是清理代码,而不管它是如何生成的(从返回,转入或异常)。通常只有清理代码应该在'finally'中运行,并且您想确保'finally'绝对不会抛出异常。考虑到这些情况,在适当的时候总是使用'try' /'finally'。 –

0

我认为Throw比try/catch有更多的开销。因此,我的意思是说,尝试/ 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#?

0

在这种情况下我认为第二种选择更快,但 作为@Samuel Neff例外情况非常缓慢。然而,当我在阅读Jon Skeet关于例外的arcticle时,我发现了一个有趣的arcticle Krzysztof CwalinaDesign Guidelines Update: Exception Throwing.,这解释了我们应该什么时候并且不应该使用异常。 逸岸读它,我发现了一个很重要的一点说:

1.2例外和性能

相关的异常的一个常见问题是,如果例外是 用于代码,经常出现故障,性能 的实施将是不可接受的。这是一个非常有效的关注。 当一个成员抛出一个异常时,其性能可能会下降幅度为 。但是,严格遵守禁止使用错误代码的 的例外准则,可以实现良好的性能。本节中描述的两种模式建议 这样做。

  • 做的,因为异常可能产生负面影响性能的担忧不是使用错误代码。