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
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.
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)