Question

PHP 5.5 has implemented finally to try-catch. My doubt is: when exactly try-catch-finally that might be more helpful than just I write below try-catch?

Example, difference between:

try { something(); }
catch(Exception $e) { other(); }
finally { another(); }

Instead of, just:

try { something(); }
catch(Exception $e) { other(); }
another();

Can send me some example that is common to this case?

Notes:

  1. I talk about try-catch-finally, and not about try-finally, only;
  2. There are some "features" cool, like you cancel current exception and throw a new-other-exception on finally (I don't tried, I read here). I don't know if it is possible without finally;
  3. Would not be more useful something like notcatch? So I can run a code if try goes without an exception. hehe
Était-ce utile?

La solution

The code within the finally block is always executed after leaving from either try or catch blocks. Of course you may continue writing code after the try-catch and it will be executed as well. But finally could be useful when you'd like to break out of code execution (such as returning from a function, breaking out of a loop etc.). You can find some examples on this page - http://us2.php.net/exceptions, such as:

function example() {
  try {
     // open sql connection
     // Do regular work
     // Some error may happen here, raise exception
  }
  catch (Exception $e){
    return 0;
    // But still close sql connection
  }
  finally {
    //close the sql connection
    //this will be executed even if you return early in catch!
  }
}

But yes, you are right; finally is not very popular in everyday use. Certainly not as much as try-catch alone.

Autres conseils

You might not catch the exception you're throwing, but you still want to run your finally statement before throwing an error (eg. always close a log file or a DB connection before fatally failing because you didn't catch the exception):

<?php

$fHandle = fopen('log.txt', 'a');

try {
    echo 'Throwing exception..';
    fwrite($fHandle, 'Throwing exception..');

    throw new BadFunctionCallException();
} catch (RangeException $e) {
    // We only want to log RangeExceptions

    echo 'Threw a RangeException: ' . $e->getMessage();
    fwrite($fHandle, 'Threw a RangeException: ' . $e->getMessage());
} finally {
    // Always make sure that we close the file before throwing an exception, even if we don't catch it

    echo 'Reached the finally block';
    fwrite($fHandle, 'Reached the finally block');
    fclose($fHandle);
}

Which would output:

Throwing exception..Reached the finally block
Fatal error: Uncaught exception 'BadFunctionCallException' in /tmp/execpad-dc59233db2b0/source-dc59233db2b0:6
Stack trace:
    #0 {main}
    thrown in /tmp/execpad-dc59233db2b0/source-dc59233db2b0 on line 6

DEMO (without the fopen as eval.in doesn't support it)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top