Вопрос проверяет понимание жизненного цикла выполнения кода при исключениях и умение гарантировать корректное завершение операций.
finally используют, когда нужно выполнить код независимо от того, произошло исключение или нет. Чаще всего там освобождают ресурсы: закрывают соединения, файлы, транзакции. Этот блок выполнится даже при return внутри try. Он помогает избежать утечек ресурсов и некорректных состояний.
Блок finally нужен не для обработки ошибок, а для гарантированного выполнения завершающих действий.
finallyОпределение:finally — это блок кода, который выполняется всегда после try и catch, независимо от того, было ли выброшено исключение.
Перед примерами важно понять общий принцип:finally отвечает за очистку и завершение, а не за логику обработки ошибок.
соединения с БД
файловые дескрипторы
сетевые подключения
try {
$conn = openConnection();
// работа с соединением
} finally {
$conn->close();
}
try {
$db->beginTransaction();
// изменения данных
$db->commit();
} catch (Throwable $e) {
$db->rollBack();
throw $e;
} finally {
// логирование, метрики, очистка
}
сброс флагов
возврат временных настроек
очистка временных данных
returnДаже если внутри try есть return, finally всё равно выполнится.
function process() {
try {
return 42;
} finally {
logAction();
}
}
finally не нуженНет ресурсов для освобождения
Вся логика укладывается в try/catch
Код в finally дублирует catch
finally стоит использовать всегда, когда нужно гарантированно завершить операцию или освободить ресурсы, независимо от успеха выполнения кода.