17

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 (/*...*/) {
        //...
    }
}
Uyghur Lives Matter
  • 18,820
  • 42
  • 108
  • 144
  • it may be surprised you, but sometimes code being written to be sensible, not to be "more efficient" nonsense. Just sensible. To make a task it's designated for. – Your Common Sense Jan 12 '11 at 20:26
  • Could the performance penalty of having a try-catch block inside a loop as opposed to being outside be approximately the same as the penalty for `for ($i = 0; $i < count($array); $i++) {...}` as opposed to `for ($i = 0; $i < $arrayCount; $i++) {...}` – Uyghur Lives Matter Jan 12 '11 at 20:48

4 Answers4

64

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
Peter Bailey
  • 105,256
  • 31
  • 182
  • 206
2

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?

Craige
  • 2,882
  • 2
  • 20
  • 28
1

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.

Pekka
  • 442,112
  • 142
  • 972
  • 1,088
0

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

Carlos Valenzuela
  • 816
  • 1
  • 7
  • 19