> Как перехватить исключение в JavaScript (JavaScript)

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

Компании: Kaspersky

Стек: JavaScript

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

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

Исключения в JavaScript перехватываются конструкцией try...catch...finally. Блок try содержит код, который может выбросить исключение, catch - обработчик ошибки с доступом к объекту ошибки, finally - код, который выполнится в любом случае. Для асинхронного кода используйте .catch() у промисов или try...catch внутри async-функций. Важно помнить, что try...catch не перехватывает ошибки в колбэках и не работает с rejected-промисами без await.

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

Базовый синтаксис выглядит так:

JAVASCRIPT
try {
// код, который может выбросить исключение
} catch (error) {
// обработка ошибки
} finally {
// выполняется всегда
}

Ключевые моменты:

  • catch получает объект ошибки. Можно опустить параметр, если он не нужен: catch { ... }.
  • finally выполняется независимо от того, была ошибка или нет. Используется для очистки ресурсов, закрытия соединений, сброса состояний.
  • Исключение можно пробросить дальше с помощью throw внутри catch - это позволяет частично обработать ошибку и передать её выше.
  • try...catch перехватывает только синхронные ошибки. Для асинхронного кода (промисы, колбэки, event listeners) нужны другие механизмы.

Для промисов:

JAVASCRIPT
somePromise()
.then(result => { /* ... */ })
.catch(error => { /* обработка */ });

В async-функциях работает обычный try...catch:

JAVASCRIPT
async function fetchData() {
try {
const response = await fetch(url);
return await response.json();
} catch (error) {
console.error('Ошибка запроса:', error);
}
}

Важно: try...catch не перехватит ошибку, если она возникнет в колбэке, который выполняется позже, вне текущего стека вызовов. Например:

JAVASCRIPT
try {
setTimeout(() => {
throw new Error('Ошибка');
}, 1000);
} catch (error) {
// этот блок не выполнится
}

Для обработки ошибок в колбэках нужно использовать собственные механизмы - например, передавать error первым аргументом в стиле Node.js или использовать промисы.

На практике

В реальном фронтенд-коде try...catch чаще всего используется:

  • при работе с fetch и обработке ответов от API;
  • при парсинге JSON: JSON.parse выбрасывает исключение при некорректном входном аргументе;
  • при обращении к localStorage или IndexedDB, которые могут быть недоступны;
  • для обработки ошибок рендеринга в React - через Error Boundaries, но это отдельный механизм.

Хорошая практика - не глотать ошибки молча. В catch стоит как минимум логировать ошибку, а в production - отправлять в систему мониторинга (Sentry, Bugsnag).

Пример кода

JAVASCRIPT
function parseUserData(rawData) {
try {
const parsed = JSON.parse(rawData);
if (!parsed.name || !parsed.age) {
throw new Error('Некорректная структура данных');
}
return parsed;
} catch (error) {
console.error('Не удалось распарсить данные:', error.message);
return null;
} finally {
console.log('Попытка парсинга завершена');
}
}
// Асинхронный пример
async function loadUser(id) {
try {
const response = await fetch(`/api/users/${id}`);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
return await response.json();
} catch (error) {
// пробрасываем дальше, чтобы обработать выше
throw new Error(`Не удалось загрузить пользователя: ${error.message}`);
}
}

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

Начните с базового синтаксиса, затем переходите к нюансам. Покажите, что понимаете разницу между синхронными и асинхронными ошибками. Упомяните, что try...catch не перехватывает ошибки в колбэках и что для промисов нужен .catch() или await. Хорошо, если приведёте пример с finally для очистки ресурсов. Если спросят про проброс ошибок - объясните, когда это оправдано. Уровень senior предполагает, что вы также знаете про Error Boundaries в React и про то, что try...catch не ловит ошибки в event listeners.

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

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

  • знание базового синтаксиса и порядка выполнения блоков;
  • понимание ограничений try...catch для асинхронного кода;
  • умение работать с объектом ошибки (message, stack, name);
  • знание паттернов проброса ошибок и обработки частичных сбоев;
  • понимание, когда использовать finally.

Для senior-позиции важно показать, что вы не просто знаете синтаксис, а понимаете, как ошибки распространяются по стеку вызовов и как правильно проектировать обработку ошибок в приложении.

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

  • Попытка перехватить ошибку из setTimeout или другого колбэка с помощью внешнего try...catch.
  • Забывают, что catch не обязателен - можно использовать только try...finally.
  • Слишком широкий catch, который ловит все ошибки без разбора и скрывает реальные проблемы.
  • Не используют finally для очистки ресурсов, дублируя код в try и catch.
  • Путают throw внутри catch с возвратом значения - throw прерывает выполнение функции.
  • Игнорируют объект ошибки в catch - без параметра теряется информация о причине сбоя.

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

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