> Как использовать try-catch для обработки ошибок при парсинге JSON в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: ITQ Group МКБ БАНК
Стек: JavaScript
> Пример ответа
Короткий ответ
try-catch - основной механизм для перехвата исключений при парсинге JSON через JSON.parse(). Обёртка в try-catch позволяет обработать синтаксические ошибки в строке JSON, предотвращая падение приложения. Важно помнить, что JSON.parse() бросает SyntaxError при некорректном входном формате, но не бросает исключений для null, undefined или пустой строки - эти случаи нужно проверять отдельно. Для асинхронных операций с fetch и response.json() также используется try-catch, но в связке с async/await.
Подробное объяснение
JSON.parse() - синхронная функция, которая бросает исключение типа SyntaxError, если входная строка не является валидным JSON. Основная сложность в том, что исключение может возникнуть не только из-за неверного формата, но и из-за неожиданных данных: null, undefined, число или булево значение не вызовут ошибку, но результат будет не тем, что ожидается.
При работе с сетевыми запросами через fetch, response.json() тоже возвращает Promise, который может быть отклонён. Здесь try-catch работает корректно только внутри async функции, потому что отклонённый Promise без await не будет пойман.
Дополнительно стоит учитывать, что try-catch перехватывает только синхронные ошибки. Если парсинг происходит внутри callback или Promise без await, try-catch не сработает - нужно использовать .catch() или async/await.
На практике
На практике обработка ошибок парсинга JSON сводится к трём сценариям:
-
Парсинг строки из localStorage или пользовательского ввода - здесь try-catch обязателен, так как данные могут быть повреждены или иметь неверный формат.
-
Парсинг ответа от API - обычно используется
async/awaitс try-catch, но дополнительно проверяетсяresponse.okперед вызовомjson(), чтобы отсечь HTTP-ошибки. -
Парсинг вложенных или опциональных полей - часто используют вспомогательную функцию-обёртку, которая возвращает
nullили значение по умолчанию при ошибке, чтобы не дублировать try-catch в каждом месте.
Для надёжности рекомендуется комбинировать try-catch с проверкой типа результата: typeof parsed === 'object' && parsed !== null. Это защищает от случаев, когда JSON.parse('null') успешно возвращает null, но код ожидает объект.
Пример кода
JAVASCRIPT// Базовый случайfunction safeParse(jsonString) {try {return JSON.parse(jsonString);} catch (error) {console.error('Ошибка парсинга JSON:', error.message);return null;}}// Парсинг с проверкой типаfunction parseObject(jsonString) {try {const parsed = JSON.parse(jsonString);if (typeof parsed !== 'object' || parsed === null) {throw new Error('Ожидался объект');}return parsed;} catch (error) {console.error('Невалидный JSON:', error.message);return {};}}// Асинхронный парсинг с fetchasync function fetchData(url) {try {const response = await fetch(url);if (!response.ok) {throw new Error(`HTTP error: ${response.status}`);}const data = await response.json();return data;} catch (error) {console.error('Ошибка запроса или парсинга:', error.message);return null;}}// Парсинг из localStoragefunction getFromStorage(key) {try {const raw = localStorage.getItem(key);if (!raw) return null;return JSON.parse(raw);} catch (error) {console.warn(`Повреждённые данные в localStorage для ключа "${key}"`);localStorage.removeItem(key);return null;}}
Как отвечать на собеседовании
Начните с базового объяснения: try-catch перехватывает SyntaxError от JSON.parse(). Затем переходите к нюансам: упомяните, что null, undefined и пустая строка не вызывают исключение, поэтому нужна дополнительная валидация. Обязательно расскажите про асинхронный случай - response.json() в связке с async/await. Покажите, что понимаете разницу между синхронными и асинхронными ошибками. Хорошо добавить пример с функцией-обёрткой для переиспользования. В конце упомяните про best practice: не использовать JSON.parse без try-catch в production-коде, если данные приходят из ненадёжного источника.
Что проверяет интервьюер
Интервьюер проверяет понимание базового механизма исключений в JavaScript, знание особенностей JSON.parse (какие входные данные не вызывают ошибку), умение работать с асинхронным кодом и осознание необходимости валидации результата. Также оценивается способность писать переиспользуемый код - например, функцию-обёртку вместо дублирования try-catch. Важен правильный выбор между try-catch и .catch() для Promise, а также понимание, что try-catch не работает с колбэками без await.
Типичные ошибки
- Забывают про
nullиundefined-JSON.parse(null)возвращаетnullбез ошибки, что ломает логику, если ожидается объект. - Используют try-catch с Promise без
await- ошибка не будет поймана, так как try-catch ловит только синхронные исключения. - Не проверяют
response.okпередjson()- при HTTP-ошибкеresponse.json()может выбросить исключение, но сообщение будет неинформативным. - Глотают ошибку без логирования - просто возвращают
null, что затрудняет отладку в production. - Парсят JSON в каждом месте без обёртки - дублирование кода и риск пропустить try-catch в одном из мест.
- Используют
catch (e)без указания типа - лучше проверятьerror instanceof SyntaxError, чтобы не перехватывать другие ошибки.
> Похожие задачи по frontend
Как соединить фиксированное количество строк через разделитель в JavaScript
Как выполняется функция с учетом хостинга в JavaScript
Как реализовать проверку кратности с остатком от деления в JavaScript
Что происходит после отправки запроса в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью