When and why can `finally` be useful?

后端 未结 2 949
不思量自难忘°
不思量自难忘° 2021-01-18 03:33

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

相关标签:
2条回答
  • 2021-01-18 04:00

    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.

    0 讨论(0)
  • 2021-01-18 04:02

    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)

    0 讨论(0)
提交回复
热议问题