Не так давно, Никита Попов, один из активистов движения «ЗА PHP», опубликовал в своём твиттере сообщение:
(Оригинал тут twitter.com/nikita_ppv/status/232930291625369600)
Далее, вольный перевод:
В этом выпуске RFC, мы попробуем представить вам поддержку нового ключевого слова "finally" в исключениях.
Без этой фичи, разрабочикам приходится часто писать конструкции вида:
С введением finally, мы не говорим, что вам придётся писать меньше кода, мы говорим, что вы получите больше возможности для управления конструкциями try/catch
Блок finally всегда выполняется когда завершается блок try/catch
Это означает, что блок finally выполняется даже, если было выкинуто исключение. Однако finally, на самом деле полезнее, чем простая обработка исключени��. Оно позволяет программистам избегать лишних конструкций для чистки памяти и\или соединений в момент обработки исключений или же, если они не были пойманы.
Щекотливым моментом, при использовании новой конструкции, это испльзование конструкции return в блоке try/catch, в этом случае, блок finally всё равно будет вызван.
результатом будет:
Ну и в случае вложенных конструкций try/catch/finally:
получим:
Так же множество примеров и кейсов, вы можете подсмотреть далее
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
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
