Не так давно, Никита Попов, один из активистов движения «ЗА PHP», опубликовал в своём твиттере сообщение:

It very much looks like PHP 5.5 will have `finally` t.co/Dy93CZaR

(Оригинал тут twitter.com/nikita_ppv/status/232930291625369600)

Далее, вольный перевод:

Представление


В этом выпуске RFC, мы попробуем представить вам поддержку нового ключевого слова "finally" в исключениях.

Без этой фичи, разрабочикам приходится часто писать конструкции вида:
<?php
$db = mysqli_connect();
try {
   call_some_function($db);
} catch (Exception $e) {
   mysqli_close($db);
   throw $e;
}
mysql_close($db);


С введением finally, мы не говорим, что вам придётся писать меньше кода, мы говорим, что вы получите больше возможности для управления конструкциями try/catch

Предложение


Блок finally всегда выполняется когда завершается блок try/catch
Это означает, что блок finally выполняется даже, если было выкинуто исключение. Однако finally, на самом деле полезнее, чем простая обработка исключени��. Оно позволяет программистам избегать лишних конструкций для чистки памяти и\или соединений в момент обработки исключений или же, если они не были пойманы.

<?php
$db = mysqli_connect();
try {
   call_some_function($db);// функция моджет выкинуть исключение, которое мы можем и не обработать
} finally {
   mysqli_close($db);

}

Щекотливым моментом, при использовании новой конструкции, это испльзование конструкции return в блоке try/catch, в этом случае, блок finally всё равно будет вызван.

<?php
  try {
    return 2;
  } finally {
    echo "Этот текст мы увидим\n";
  }
  //Этот текст мы увидим
  echo "Этот текст мы НЕ увидим";

результатом будет:

Этот текст мы увидим
//return int(2)

Ну и в случае вложенных конструкций try/catch/finally:

<?php
function foo ($a) {
   try {
      echo "1";
      try {
        echo "2";
        throw new Exception("ex");
      } catch (Exception $e) {
        echo "3";
      } finally {
        echo "4";
        throw new Exception("ex");
      }
   } catch (Exception $e) {
      echo "3";
   } finally {
      echo "2";
   }
   return 1;
}
 
var_dump(foo("para"));

получим:

123432int(1)

Тесты и Примеры


Так же множество примеров и кейсов, вы можете подсмотреть далее

https://github.com/laruence/php-src/blob/finally/Zend/tests/catch_finally_001.phpt
https://github.com/laruence/php-src/blob/finally/Zend/tests/catch_finally_002.phpt
https://github.com/laruence/php-src/blob/finally/Zend/tests/catch_finally_003.phpt
https://github.com/laruence/php-src/blob/finally/Zend/tests/catch_finally_004.phpt
https://github.com/laruence/php-src/blob/finally/Zend/tests/catch_finally_005.phpt
https://github.com/laruence/php-src/blob/finally/Zend/tests/catch_finally_006.phpt
https://github.com/laruence/php-src/blob/finally/Zend/tests/try_finally_001.phpt
https://github.com/laruence/php-src/blob/finally/Zend/tests/try_finally_002.phpt
https://github.com/laruence/php-src/blob/finally/Zend/tests/try_finally_003.phpt