9 августа 2012 в 12:31

В PHP 5.5 возможно появится Finally перевод

PHP*
Не так давно, Никита Попов, один из активистов движения «ЗА 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
Перевод: Xinchen Hui
Саша Молодцов @okopok
карма
2,0
рейтинг 0,0
Похожие публикации
Самое читаемое Разработка

Комментарии (41)

  • +11
    Наконец-то! Очень надеюсь, что введут finally.
    • +14
      finally, php will support `finally`
  • +2
    Да уж, расширение существующей функции, бывает порой, более необходимой, чем добавление новой.
  • +15
    try {
    return true;
    } finally {
    return false;
    }
    WTF?
    • +3
      Думаю, развернётся в:
      return false;
      return true;
      

      <irony>Конечно при условии, что return true выкинет исключение</irony>
      • +2
        Единственный вариант запретить flow-control операторы в блоке finally. Не думаю, что на такое пойдут. Просто объявят это «bad practice» и все.
        • 0
          Это был ответ на коммент выше :(
    • 0
      Разве finaly не должен выполняться лишь только в случае, когда исключение будет брошено?
      Т.е. если внутри try не будет исключения, то finally не выполнится.

      Лично я так вижу принцип действия данного оператора.
      • 0
        Смысла тогда в нём особого не будет. В finally мы будем всегда закрывать коннекты, писать логи, работать с транзакциями… вариантов много… а catch — это для более тонкой настройки останется.
        • +5
          Ой, я действительно чепуху написал :)
      • +1
        Для этого есть catch, а finally именно то, что выполнится в любом случае, что при выбросе исключения, что без него.
      • 0
        В статье описано другой случай.
    • 0
      Поздравляю, вы написали 4 лишних строки кода.
  • –32
    >В try/catch добавят finally
    Инновации уровня PHP
    > Не так давно, Никита Попов, один из активистов движения «ЗА PHP», опубликовал в своём твиттере сообщение
    Сначала хотел удивиться, но потом увидел в твиттере
    >17 year old student
    • +5
      при чем здесь возраст? минус вам
    • +3
      > Сначала хотел удивиться, но потом увидел в твиттере
      >>17 year old student

      Что Вы хотели этим сказать?
      • +2
        тот самый попов? О_о
        • +2
          Нет. У этого не стыдно купить самоучитель по PHP. Я бы даже купил.
    • +23
      Сначала хотел удивиться, увидев этот коментарий, но потом увидел в профиле:
      > Дата рождения: 15 апреля 1991
      • 0
        По моему, вы ведете диалог в том же ключе как и тому, кому вы отвечаете, причем здесь возраст опять же.
        И самое удивительно, на мой взгляд, вас еще кто-то плюсует.
        • +4
          Демонстрирую несостоятельность аргумента о возрасте. По сюжету, должен появиться кто-то старше меня, и написать такой же комментарий, ссылаясь на мой возраст.
          • +1
            Сейчас напишем…
            А по сути, я бы пугался больше фамилии, нежели возраста, хотя согласен, есть о чем подумать.

            По поводу фамилии: был и есть Евгений Попов с его эпическими уроками HTML/PHP в одном флаконе, потом Денис Попов и BolgenOS… Теперь вот Никита.
            • +6
              После изобретения радио, Поповы не те пошли
              • +1
                Раньше были и Поповы лучше и трава зеленее.
                • НЛО прилетело и опубликовало эту надпись здесь
            • 0
              У меня двое знакомых — Никиты Поповы, оба — программисты.
          • +1
            Ну, раз Вы просите:
            Зашёл на Хабр, почитал комменты, потом посмотрел возраст комментаторов,…
            :)

            P.S. интересный метод выявления самого взрослого читателя Хабра :)

        • +1
          Это был тонкий намек автору ветки, мол, прежде чем пытаться о ком то судить по ничего не значащим метрикам — подумай, а как с помощью тех же метрик оценить можешь себя.

          Хотя можно сократить до «прежде чем сделать что-то — подумай!».
        • 0
          Так это логично. Он указал товарищу Артему, что его комментарий дискредитирует и его самого.
      • +2
        Сначала хотел удивиться, увидев этот коментарий, но потом увидел в профиле:
        > Дата рождения: 1 августа 1986
        • +2
          Ну Вы в курсе, да? ))
  • 0
    «ЗА PHP»
    Отличный пример того почему не надо смешивать английские и русские слова. «За рнр»!
    • +1
      Я все же подозреваю, что в этом блоге все всё правильно поняли ;-)
  • –2
    У капитана PHP появляется помощник.
    itmages.ru/image/view/630298/ffdfe7bb
  • 0
    Надо отметить, что, как и в джаве, решили не гарантировать выполнение finally во всякие критичные ситуации типа фатал еррор, закрытие процесса
    • 0
      Я думаю, что как только предложение «превратить все фаталы, ворнинги и т.д в исключения» пройдет стадию обсуждения и апрува, то и finally начнет все спазу отлавливать и обрабатывать ;-)
      • 0
        Вряд ли, судя по обсуждениям в мейл-листе, никто не хочет такое поведение
        • 0
          Вообще конечно в мэйл-листе много интересных тем обсуждается. Постараюсь следить за ним:-)
  • +1
    Finally!
  • 0
    finally хорошо, но я думаю пора уже и вместо вывода ошибок на уровне E_WARNING начать выкидовать исключения. А пока придётся писать нелепые обёртки.
    • 0
      Как вариант, но с директивой в php.ini, по умолчанию кидающей варнинг.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.