Когда и почему «наконец» может быть полезно?

PHP 5.5 finally реализовал try-catch . Я сомневаюсь: когда именно try-catch-finally это может быть более полезно, чем просто написать ниже try-catch ?

Пример: разница между:

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

Вместо этого просто:

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

Могу отправить мне пример, который является общим для этого случая?

Примечания :

  1. Я говорю о try-catch-finally , а не о try-finally , только;
  2. Есть некоторые «функции», такие как вы отменяете текущее исключение и, наконец, бросаете новое-другое исключение (я не пробовал, я читал здесь ). Я не знаю, возможно ли это finally ;
  3. Не было бы более полезным что-то вроде notcatch ? Поэтому я могу запускать код, если try идет без исключения. хе-хе

    Код в блоке finally всегда выполняется после выхода из блоков try или catch . Конечно, вы можете продолжить писать код после try-catch, и он также будет выполнен. Но, наконец, может быть полезно, когда вы хотите вырваться из выполнения кода (например, возврат из функции, выход из цикла и т. Д.). Вы можете найти несколько примеров на этой странице – http://us2.php.net/exceptions , например:

     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! } } 

    Но да, вы правы; finally , не очень популярна в повседневном использовании. Конечно, это не так много, как попытка-ловушка.

    Вы не можете поймать исключение, которое вы бросаете, но вы все еще хотите запустить свой finally оператор перед тем, как выбросить ошибку (например, всегда закрывайте файл журнала или соединение с БД до смертельного сбоя, потому что вы не заметили исключение):

     <?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); } 

    Что будет выводить:

     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 (без fopen поскольку eval.in его не поддерживает)