Итак, сегодня я прочитал об исключениях в онлайн-руководстве по PHP и понял, что мне еще предстоит понять цель или реальную необходимость ключевого слова finally. Я прочитал несколько сообщений здесь, поэтому мой вопрос немного отличается.
Я понимаю, что мы можем использовать finally таким образом:
function hi(){
return 'Hi';
}
try {
throw new LogicException("Throw logic \n");
} catch (InvalidArgumentException $e) {
echo $e->getMessage();
}
echo hi();
выход:
Fatal error: Uncaught LogicException: Throw Logic in C:\Users\...a.php:167
Stack trace:
#0 {main}
thrown in C:\Users\...a.php on line 167
Итак, в данном случае функция hi(); не выполняется и по уважительной причине. Я понимаю, что если исключение не обрабатывается, интерпретатор php останавливает скрипт. хорошо. Пока что, насколько я читал, наконец-то позволяет нам выполнить функцию hi(); даже если исключение не обрабатывается (хотя я не знаю, почему)
Так вот этот я понимаю.
try {
throw new LogicException("Throw logic \n");
} catch (InvalidArgumentException $e) {
echo $e->getMessage();
}finally{
echo hi();
}
выход:
Hi
Fatal error: Uncaught LogicException: Throw Logic in C:\Users\...a.php:167
Stack trace:
#0 {main}
thrown in C:\Users\...a.php on line 167
Это должно быть ошибка исключения, а также сообщение «привет» от функции, даже если я не знаю, как это использовать. Но чего я не понимаю, даже если мы перехватим LogicException
с помощью catch (LogicException $e)
и не будет выдано никаких исключений, мы все равно увидим, что функция выполняется, и мы увидим сообщение «привет». как в этом примере
try {
throw new LogicException("Throw logic \n");
} catch (LogicException $e) {
echo $e->getMessage();
}finally{
echo hi();
}
выходы
// Throw logic
// Hi
Таким образом, мы по-прежнему видим выполнение функции hi()
, хотя у нас нет исключений Uncaught. Почему и какая польза от этого? Я думал, что блок finally должен использоваться в качестве последнего средства на случай, если исключения не будут перехвачены, даже если это не так, то зачем его запускать?
finally
не была добавлена до версии PHP 5.5. - person Alec Gordon   schedule 12.01.2017finally
выполняется после всего кода вtry
+catch
. - person German Lashevich   schedule 12.01.2017