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

Dom*_*ang 12 c#

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

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

Fré*_*idi 18

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

从技术上讲,如果你的循环的所有迭代是"平等",循环应尽快发生异常停止,那么最好把try... catch块的循环之外.如果循环必须继续,尽管发生异常,您将被迫将块放在循环中,但在这种情况下您可能想要检查您的设计.

  • +1唯一的"正确"答案,因为它引用了try/catch块而不仅仅是异常.但是,我确实有一些设计,如果其中一个"监听器"抛出异常,处理应该继续.我想知道如何重写呢?例如:`foreach(监听器中的var listener){try {invoke(Y); } catch(异常错误){_ logger.Warning("客户端XX做了bla bla",错误); }}` (2认同)

Ode*_*ded 10

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

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

  • @ Domi.Zhang - 不,如果你在`catch`中处理异常,循环将恢复. (2认同)