Что означает ключевое слово `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()
, а второй? Я пропустил эту точку целиком?
Ответы
Ответ 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.
Но я думаю, что это иллюстрирует Исключения и использование ключевого слова наконец очень хорошо.