为什么我要把try / catch块放在循环之外?

时间:2011-10-28 10:26:58

标签: c#

以下是Practice& Patterns团队的CodeReview指南。http://msdn.microsoft.com/zh-cn/library/ms998574#scalenetchapt13_topic7(链接会自动导航到Exception部分。)

他们说当你处理异常时你应该把try / catch块放在循环之外,我想知道为什么?

4 个答案:

答案 0 :(得分:17)

因为try... catch块的底层实现会增加生成代码的开销,并且将这些开销置于紧密循环中并不是一个好主意,性能方面。

从技术上讲,如果你的循环的所有迭代都是“相等的”,并且一旦发生异常就应该停止循环,那么最好将try... catch块放在循环之外。如果循环必须继续,尽管发生异常,你将被迫将块放在循环中,但在这种情况下你可能想要检查你的设计。

答案 1 :(得分:10)

异常是昂贵的 - 如果将异常逻辑放在循环中,则可能会在循环中的每次迭代中抛出异常。这很容易导致性能问题。

如果将try / catch块放在循环之外,则只需要处理一个异常。

答案 2 :(得分:2)

循环内的try/catch行为与循环外的行为不同,除非它总是重新抛出异常。

因此,您的选择将取决于您的要求:如果您想继续循环,则在循环内捕获,否则在外部。

我认为推荐的原因是循环中的try/catch看起来像是使用控制流的异常。它标志着一种潜在的“代码味道”,而不是陈述一个严格而快速的规则。

但如果这是你的要求,那么忽略这个建议是合理的。举一个简单但过时的例子,在一个没有Int32.TryParse的世界里(.NET 1.x就在不久之前!),有一个循环使用{将字符串列表解析为整数是合理的。 {1}}在循环内的try / catch中。

答案 3 :(得分:1)

由于循环中可能出现多个异常,导致应用程序中出现不必要的开销。

如果在那里发现错误,那么在循环外处理会更有意义。