> Как перехватить исключение в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Kaspersky
Стек: JavaScript
> Пример ответа
Короткий ответ
Исключения в JavaScript перехватываются конструкцией try...catch...finally. Блок try содержит код, который может выбросить исключение, catch - обработчик ошибки с доступом к объекту ошибки, finally - код, который выполнится в любом случае. Для асинхронного кода используйте .catch() у промисов или try...catch внутри async-функций. Важно помнить, что try...catch не перехватывает ошибки в колбэках и не работает с rejected-промисами без await.
Подробное объяснение
Базовый синтаксис выглядит так:
JAVASCRIPTtry {// код, который может выбросить исключение} catch (error) {// обработка ошибки} finally {// выполняется всегда}
Ключевые моменты:
catchполучает объект ошибки. Можно опустить параметр, если он не нужен:catch { ... }.finallyвыполняется независимо от того, была ошибка или нет. Используется для очистки ресурсов, закрытия соединений, сброса состояний.- Исключение можно пробросить дальше с помощью
throwвнутриcatch- это позволяет частично обработать ошибку и передать её выше. try...catchперехватывает только синхронные ошибки. Для асинхронного кода (промисы, колбэки, event listeners) нужны другие механизмы.
Для промисов:
JAVASCRIPTsomePromise().then(result => { /* ... */ }).catch(error => { /* обработка */ });
В async-функциях работает обычный try...catch:
JAVASCRIPTasync function fetchData() {try {const response = await fetch(url);return await response.json();} catch (error) {console.error('Ошибка запроса:', error);}}
Важно: try...catch не перехватит ошибку, если она возникнет в колбэке, который выполняется позже, вне текущего стека вызовов. Например:
JAVASCRIPTtry {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).
Пример кода
JAVASCRIPTfunction 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- без параметра теряется информация о причине сбоя.
> Похожие задачи по frontend
Есть ли вероятность, что количество ключей, полученных через for-in и Object.keys, будет разным для одного объекта и при каком условии
Какая конструкция может использоваться вместе с try-catch в JavaScript
Как предотвратить всплытие события при клике на вложенные контейнеры в JavaScript
Как досрочно выйти из метода map в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью