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

本文关键字:循环 catch 我要 try 为什么 | 更新日期: 2023-09-27 18:12:43

以下是Practice&Patterns团队。http://msdn.microsoft.com/zh-cn/library/ms998574#scalenetchapt13_topic7(链接自动导航到异常部分。(

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

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

因为try... catch块的底层实现会给生成的代码增加开销,而从性能角度来看,将该开销放在一个紧密的循环中不是一个好主意。

从技术上讲,如果循环的所有迭代都是"相等"的,并且一旦出现异常,循环就会停止,那么最好将try... catch块放在循环之外。如果在出现异常的情况下循环必须继续,您将被迫将块放入循环中,但在这种情况下,您可能需要检查您的设计。

异常代价高昂-如果将异常逻辑放入循环中,则可能会在循环中的每个迭代中引发异常。这很容易导致性能问题。

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

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

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

我认为推荐的原因是,循环中的try/catch看起来可疑地像是在控制流中使用异常。它是在标记潜在的"代码气味",而不是声明一个硬性的规则。

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

由于循环中可能出现多个异常,这会在应用程序中造成不必要的开销。

如果在其中发现了错误,那么在循环之外进行处理更有意义。