问题
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:
- I talk about
try-catch-finally
, and not abouttry-finally
, only; - 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
; - Would not be more useful something like
notcatch
? So I can run a code iftry
goes without an exception. hehe
回答1:
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.
回答2:
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)
来源:https://stackoverflow.com/questions/22597434/when-and-why-can-finally-be-useful