PHP: try-catch-finally в l oop с продолжением в catch - PullRequest
0 голосов
/ 25 февраля 2020

Хорошо, просто технический вопрос по поводу кода выше:

foreach($x as $y){ // or even a simple for()
    try{
        a();
    } catch(\Exception $e){
        // just skip current iteration
        continue;
    } finally {
        c();
    }
}

Поскольку c() находится в блоке finally, его следует всегда выполнять, но как насчет оператора continue?
В соответствии с документацией кажется, что он пропускает блок finally.

Итак, выполняется ли c() в случае a(), генерирующего исключение?

1 Ответ

1 голос
/ 25 февраля 2020

Это просто обнаружить, просто используя консоль. Введите

php -r 'foreach([1, 2] as $n){try {echo "\n", $n, "\n"; throw new \Exception();} catch (\Exception $e) {continue;} finally {echo "finally has been called";}}'

, представляющее собой одностроковое представление кода

foreach ([1, 2] as $n) {
    try {
        echo "\n", $n, "\n";
        throw new \Exception();
    } catch (\Exception $e) {
        continue;
    } finally {
        echo "finally has been called";
    }
}

, которое вы получите

1
finally has been called
2
finally has been called
...