> Как использовать 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 сводится к трём сценариям:

  1. Парсинг строки из localStorage или пользовательского ввода - здесь try-catch обязателен, так как данные могут быть повреждены или иметь неверный формат.

  2. Парсинг ответа от API - обычно используется async/await с try-catch, но дополнительно проверяется response.ok перед вызовом json(), чтобы отсечь HTTP-ошибки.

  3. Парсинг вложенных или опциональных полей - часто используют вспомогательную функцию-обёртку, которая возвращает 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 {};
}
}
// Асинхронный парсинг с fetch
async 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;
}
}
// Парсинг из localStorage
function 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, чтобы не перехватывать другие ошибки.

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

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