以下是Practice& Patterns团队的CodeReview指南。http://msdn.microsoft.com/zh-cn/library/ms998574#scalenetchapt13_topic7(链接会自动导航到Exception部分。)
他们说当你处理异常时你应该把try / catch块放在循环之外,我想知道为什么?
答案 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)
由于循环中可能出现多个异常,导致应用程序中出现不必要的开销。
如果在那里发现错误,那么在循环外处理会更有意义。