PHP try-catch块内循环

时间:2011-01-12 20:07:20

标签: php performance try-catch

在try循环中放置try-catch块是否效率低,而不是在php中使用try-catch包装循环,如果发生异常,循环将结束?或者基本上没有区别?

编辑:

即,

foreach (/*...*/) {
    //...
    try {
        //...
    } catch (/*...*/) {
        break;
    }
    //...
}

try {
    foreach (/*...*/) {
        //...
    }
}

4 个答案:

答案 0 :(得分:40)

这完全取决于失败的性质,以及您打算在catch中做些什么。

但我会像这样推广它

  • 如果您希望循环在Exception上退出,请包装整个循环
  • 如果您希望循环继续,请不要

修改

循环中捕获的异常不会隐式破坏循环

for ($i = 1; $i < 10; $i++) {
    try {
        if ($i % 3 == 0) {
            throw new Exception('BOOM');
        }
        echo $i;
    } catch (Exception $e) {
        echo "Exception at $i";
    }
    echo PHP_EOL;
}

输出:

1
2
Exception at 3
4
5
Exception at 6
7
8
Exception at 9

那些在外面循环的人

try {
    for ($i = 1; $i < 10; $i++) {
        if ($i % 3 == 0) {
            throw new Exception('BOOM');
        }
        echo $i, PHP_EOL;
    }
} catch ( Exception $e ) {
    echo "Exception at $i";
}

输出:

1
2
Exception at 3

答案 1 :(得分:2)

这完全取决于你如何使用try-catch?如果抛出异常,继续循环访问主题是否安全?

答案 2 :(得分:1)

很可能没有区别。这种级别的优化在PHP等解释性语言中通常没有任何意义。

在大多数情况下,您的逻辑将要求您无论如何都要将块放入循环中。否则,即使发生错误,循环也会继续。

答案 3 :(得分:0)

当然,有一个区别,最明显的方式是在第一种情况下,你只会在进入循环之前检查错误,如果循环没有异常抛出者,就这样离开。另一方面,你将在每次迭代中检查它,如果你有句子或方法,你将需要它...这可能有例外。

我不知道自己是否解释得很好,如果你理解,请告诉我