开发者

PHP try-catch block inside loop [duplicate]

This question already has answers here: Performance of try-catch in php 开发者_开发百科 (9 answers) Closed 7 years ago.

Is it less efficient to put a try-catch block inside of a loop as opposed to wrapping the loop with a try-catch in php if it is intended that the loop will end if an exception occurs? Or is there essentially no difference?

EDIT:

i.e.,

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

versus:

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


That entirely depends on the nature of the failure, and what you intend to do in the catch.

But I'd generalize it like so

  • If you want the loop to exit on Exception, wrap the whole loop
  • If you want the loop to continue, don't

EDIT

Exceptions caught inside a loop don't implicitly break the loop

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;
}

output:

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

Whereas those caught outside the loop do

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";
}

output:

1
2
Exception at 3


That depends entirely on how you are using the try-catch? Is it safe to continue looping through your subject if an exception was thrown?


There is most likely no difference. Optimization on this level does usually not make any sense in an interpreted language like PHP.

In most cases, your logic will require you to put the block inside the loop anyway. Otherwise, the loop will continue even if an error has occurred.


Of course, there's a difference, in the most obvious way int the first case you will only check for errors before entering the loop, if the loop doesn't have exception throwers, leave it that way. In the other hand you will be checking it in each iteration, wich you'll need if you have sentences or methods ... wich can have exceptions.

I'dont know if i explain myself well, let me know if you understand

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜