Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: finally, return, try catch, exception handling, control flow

Как ведет себя return внутри finally?

Этот вопрос проверяет понимание приоритета выполнения блока finally и его взаимодействия с оператором return в JavaScript.

Короткий ответ

Если в блоке finally есть оператор return, он переопределит результат, возвращаемый из блока try или catch. Это означает, что значение, возвращаемое из try или catch, будет проигнорировано, и функция вернет значение из finally. Такое поведение может быть неочевидным и часто считается антипаттерном, так как скрывает исходный результат выполнения или ошибку.

Длинный ответ

В JavaScript блок finally является частью конструкции try...catch...finally и предназначен для выполнения кода, который должен быть запущен независимо от того, возникло исключение в блоке try или нет. Обычно он используется для освобождения ресурсов, например, закрытия файлов или соединений с базой данных.

Приоритет return в finally

Ключевое поведение заключается в том, что если внутри блока finally используется оператор return, то именно это значение становится возвращаемым значением всей функции. Это происходит даже если в блоке try или catch уже был выполнен свой return или было выброшено исключение. Таким образом, finally "перехватывает" управление возвратом.

Примеры кода

Рассмотрим пример, где return в finally переопределяет возврат из try:

function example1() {
  try {
    console.log('Inside try');
    return 'from try';
  } catch (err) {
    console.log('Inside catch');
    return 'from catch';
  } finally {
    console.log('Inside finally');
    return 'from finally';
  }
}

console.log(example1());
// Вывод в консоль:
// Inside try
// Inside finally
// from finally

Как видно, функция вернула строку "from finally", а значение "from try" было проигнорировано.

Если в блоке try выброшено исключение, а в finally есть return, то исключение также будет подавлено:

function example2() {
  try {
    throw new Error('Error in try');
  } catch (err) {
    console.log('Caught:', err.message);
    return 'from catch';
  } finally {
    console.log('Finally block');
    return 'from finally';
  }
}

console.log(example2());
// Вывод:
// Caught: Error in try
// Finally block
// from finally

Ошибка была перехвачена в catch, но возвращено значение из finally. Это может скрыть важную информацию об ошибке, что является опасным побочным эффектом.

Где это применяется и вывод

На практике использование return внутри finally крайне не рекомендуется. Оно нарушает ожидаемый поток управления и может привести к трудноотлаживаемым багам, особенно когда скрываются исключения. Основное назначение finally — выполнение очистки, а не возврат значений.

Итог: Избегайте оператора return в блоке finally. Используйте этот блок только для гарантированного выполнения кода очистки, чтобы не маскировать результаты основной логики или ошибки.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    3

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#finally

#return

#try catch

#exception handling

#control flow

Подпишись на React Developer в телеграм

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию