PHP try-catch块内循环

use*_*450 11 php performance try-catch

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

编辑:

foreach (/*...*/) {
    //...
    try {
        //...
    } catch (/*...*/) {
        break;
    }
    //...
}
Run Code Online (Sandbox Code Playgroud)

与:

try {
    foreach (/*...*/) {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*ley 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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

1
2
Exception at 3
4
5
Exception at 6
7
8
Exception at 9
Run Code Online (Sandbox Code Playgroud)

而那些在循环之外被捕的人呢

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";
}
Run Code Online (Sandbox Code Playgroud)

输出:

1
2
Exception at 3
Run Code Online (Sandbox Code Playgroud)

  • 如果异常被捕获,则不会.我将添加一个例子 (2认同)
  • 很好的例子,谢谢! (2认同)

Pek*_*ica 1

很可能没有区别。对于像 PHP 这样的解释性语言,此级别的优化通常没有任何意义。

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