> Какая конструкция может использоваться вместе с try-catch в JavaScript (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Kaspersky

Стек: JavaScript

> Пример ответа

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

С try-catch в JavaScript используется конструкция finally. Блок finally выполняется всегда - и после успешного выполнения try, и после catch, и даже если в try или catch произошёл выход через return, break, continue или throw. Это гарантирует выполнение cleanup-логики, например, закрытие соединений, очистку таймеров или сброс состояния. Также с try-catch может использоваться throw для генерации ошибок, но это не отдельная конструкция, а оператор.

Подробное объяснение

Конструкция try-catch-finally - это полный синтаксис обработки исключений в JavaScript. Блок finally не является обязательным, но именно он позволяет выполнить код независимо от результата. Порядок выполнения:

  1. Выполняется код в try.
  2. Если в try возникла ошибка - выполняется catch (если он есть).
  3. В любом случае выполняется finally.

Важный нюанс: если в try или catch есть return, значение возвращается только после выполнения finally. Если в finally есть собственный return, он переопределяет возвращаемое значение из try/catch.

Также стоит упомянуть, что catch может быть опущен, если есть finally - это допустимо в современном JavaScript. Но на практике чаще используют полную связку.

На практике

В реальном коде finally используется для освобождения ресурсов: закрытие WebSocket, очистка setInterval, снятие блокировок, удаление временных файлов. Это особенно важно в асинхронном коде, где забытый cleanup может привести к утечкам памяти или некорректному поведению.

Ещё один паттерн - использование finally для остановки индикатора загрузки: независимо от результата запроса, спиннер должен быть скрыт. Это избавляет от дублирования кода в try и catch.

Пример кода

JAVASCRIPT
async function fetchData() {
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), 5000);
try {
const response = await fetch('/api/data', { signal: controller.signal });
return await response.json();
} catch (error) {
console.error('Request failed:', error);
return null;
} finally {
clearTimeout(timer); // всегда очищаем таймер
}
}

Как отвечать на собеседовании

Начните с прямого ответа: finally. Затем кратко объясните семантику: блок выполняется всегда. Упомяните, что finally используется для cleanup-логики. Если спросят глубже - расскажите про взаимодействие с return и про то, что finally может переопределить возвращаемое значение. Хорошо добавить пример из практики, где без finally пришлось бы дублировать код. Не углубляйтесь в редкие edge cases, если не просят.

Что проверяет интервьюер

Интервьюер проверяет:

  • знание полного синтаксиса обработки ошибок, а не только try-catch;
  • понимание гарантий выполнения finally;
  • умение применять finally для освобождения ресурсов;
  • осознание порядка выполнения при return внутри try/catch;
  • способность объяснить практическую пользу конструкции.

Типичные ошибки

  • Ответ только catch или throw - это не конструкции, а части синтаксиса.
  • Утверждение, что finally выполняется только при ошибке - это неверно.
  • Игнорирование того факта, что finally выполняется до return.
  • Попытка использовать finally для обработки ошибок - это не его задача.
  • Забывают, что finally может существовать без catch.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью