PHP try-catch 块内部循环

2022-08-30 23:57:09

如果打算在发生异常时循环结束,那么将 try-catch 块放在循环内,而不是在 php 中用 try-catch 包装循环,效率是否较低?还是基本上没有区别?

编辑:

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

对:

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

答案 1

这完全取决于失败的性质,以及您打算在 .catch

但我会这样概括它

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

编辑

在循环中捕获的异常不会隐式中断循环

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

答案 2

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


推荐