Подтвердить что ты не робот

Что означает ключевое слово `finally` в PHP?

Рассмотрим эти два примера

<?php
function throw_exception() {
    // Arbitrary code here
    throw new Exception('Hello, Joe!');
}

function some_code() {
    // Arbitrary code here
}

try {
    throw_exception();
} catch (Exception $e) {
    echo $e->getMessage();
}

some_code();

// More arbitrary code
?>

и

<?php
function throw_exception() {
    // Arbitrary code here
    throw new Exception('Hello, Joe!');
}

function some_code() {
    // Arbitrary code here
}

try {
    throw_exception();
} catch (Exception $e) {
    echo $e->getMessage();
} finally {
    some_code();
}

// More arbitrary code
?>

Какая разница? Есть ли ситуация, когда первый пример не выполнил бы some_code(), а второй? Я пропустил эту точку целиком?

4b9b3361

Ответ 1

Если вы улавливаете исключение (любое исключение), то два примера кода эквивалентны. Но если вы обрабатываете только определенный тип исключения в своем блоке класса и возникает другой вид исключения, то some_code(); будет выполняться только в том случае, если у вас есть блок finally.

try {
    throw_exception();
} catch (ExceptionTypeA $e) {
    echo $e->getMessage();
}

some_code(); // Will not execute if throw_exception throws an ExceptionTypeB

а

try {
    throw_exception();
} catch (ExceptionTypeA $e) {
    echo $e->getMessage();
} finally {
    some_code(); // Will be execute even if throw_exception throws an ExceptionTypeB
}

Ответ 2

блок fianlly используется, когда вы хотите, чтобы часть кода выполнялась независимо от того, произошло ли исключение или нет...

Ознакомьтесь с примером 2 на этой странице:

Руководство по PHP

Ответ 3

Наконец, будет срабатывать, даже если исключение не было обнаружено.

Попробуйте этот код, чтобы узнать, почему:

<?php
class Exep1 extends Exception {}
class Exep2 extends Exception {}

try {
  echo 'try ';
  throw new Exep1();
} catch ( Exep2 $e)
{
  echo ' catch ';
} finally {
  echo ' finally ';
}

echo 'aftermath';

?>

вывод будет

try  finally 
Fatal error: Uncaught exception 'Exep1' in /tmp/execpad-70360fffa35e/source-70360fffa35e:7
Stack trace:
#0 {main}
  thrown in /tmp/execpad-70360fffa35e/source-70360fffa35e on line 7

здесь скрипка для вас. https://eval.in/933947

Ответ 4

http://www.youtube.com/watch?v=EWj60p8esD0

Смотреть от: 12:30 вперед

Посмотрите это видео. Однако язык JAVA. Но я думаю, что это иллюстрирует Исключения и использование ключевого слова наконец очень хорошо.