Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про 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. Используйте этот блок только для гарантированного выполнения кода очистки, чтобы не маскировать результаты основной логики или ошибки.

Уровень

  • Рейтинг:

    3

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

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

#finally

#return

#try catch

#exception handling

#control flow

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