Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

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

Что вернется из метода при return в try/catch/finally?

Вопрос проверяет понимание порядка выполнения и возврата значений в блоках try-catch-finally, что важно для корректной обработки ошибок и управления потоком данных.

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

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

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

Конструкция try-catch-finally в JavaScript (и многих других языках) используется для обработки исключений. Ключевой аспект — взаимодействие оператора return внутри этих блоков с потоком управления и возвращаемым значением функции.

Порядок выполнения и возврата

Когда в блоке try встречается оператор return, выполняется следующее:

  • Вычисляется значение выражения после return.
  • Это значение «запоминается» как результат функции.
  • Затем управление переходит к блоку finally (если он присутствует). Блок finally выполняется всегда, независимо от того, было ли исключение или return.
  • Если в блоке finally есть свой оператор return, то именно это значение становится окончательным результатом функции, перезаписывая ранее запомненное значение из try (или catch).
  • Если в finally нет return, функция вернёт то значение, которое было запомнено из try (или catch, если было исключение).

Примеры кода

Рассмотрим несколько сценариев:

function example1() {
  try {
    console.log('try');
    return 'from try';
  } catch (err) {
    console.log('catch');
  } finally {
    console.log('finally');
  }
}
console.log(example1()); // Вывод: try, finally, 'from try'

В этом случае finally выполняется, но не возвращает своего значения, поэтому результат — 'from try'.

function example2() {
  try {
    console.log('try');
    return 'from try';
  } catch (err) {
    console.log('catch');
  } finally {
    console.log('finally');
    return 'from finally';
  }
}
console.log(example2()); // Вывод: try, finally, 'from finally'

Здесь return в finally переопределяет возвращаемое значение.

function example3() {
  try {
    console.log('try');
    throw new Error('Oops!');
  } catch (err) {
    console.log('catch');
    return 'from catch';
  } finally {
    console.log('finally');
  }
}
console.log(example3()); // Вывод: try, catch, finally, 'from catch'

При возникновении исключения в try, управление переходит в catch, где также может быть return. Finally выполняется после catch, и если в finally нет return, возвращается значение из catch.

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

Понимание этого поведения критично при работе с ресурсами, требующими обязательного освобождения (например, закрытие файловых дескрипторов, соединений с базой данных). Блок finally гарантирует, что код очистки выполнится, даже если в try или catch произошёл return. Однако нужно быть осторожным с return внутри finally, так как он может «затереть» важное значение или скрыть выброшенное исключение.

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

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

#try catch finally

#exception handling

#return statement

#JavaScript

#control flow

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