> Почему ошибку в промисе лучше обрабатывать через catch, а не через console.error? (JavaScript)

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

Компании: Альфа-банк

Стек: JavaScript

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

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

catch перехватывает ошибку в цепочке промисов и позволяет корректно обработать её, не прерывая выполнение скрипта и не засоряя консоль. console.error просто выводит сообщение, но не останавливает распространение ошибки - она остаётся неперехваченной, что может привести к падению приложения или неопределённому состоянию. В production-коде catch даёт контроль над логикой восстановления, логирования и уведомления пользователя.

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

Когда промис завершается с ошибкой и у него нет обработчика catch, эта ошибка становится необработанным rejection (unhandled promise rejection). В Node.js это может завершить процесс, а в браузере - вызвать предупреждение в консоли и потенциально утечку памяти. console.error не перехватывает ошибку - он лишь выводит её в консоль, после чего ошибка продолжает всплывать. catch же перехватывает rejection и даёт возможность:

  • восстановить выполнение, вернув значение по умолчанию
  • пробросить ошибку дальше с дополнительным контекстом
  • выполнить очистку ресурсов
  • залогировать ошибку в систему мониторинга

Кроме того, catch работает как часть асинхронного потока: если ошибка возникла в then, она тоже попадёт в ближайший catch. console.error не участвует в этом механизме.

На практике

В реальном коде catch обязателен для всех промисов, которые могут упасть. Например, при запросе к API: если сервер вернул 500, catch позволяет показать пользователю сообщение об ошибке, а не оставить интерфейс в загрузке. console.error используют только для отладки, но никогда как единственный обработчик. В production ошибки отправляются в Sentry или аналогичную систему через catch, а не выводятся в консоль.

Пример кода

JAVASCRIPT
// Плохо: ошибка не обработана, только выведена в консоль
fetch('/api/data')
.then(response => response.json())
.then(data => console.log(data))
.then(null, err => console.error(err)); // ошибка не перехвачена, rejection остаётся
// Хорошо: catch перехватывает и обрабатывает
fetch('/api/data')
.then(response => {
if (!response.ok) throw new Error('HTTP error ' + response.status);
return response.json();
})
.then(data => renderData(data))
.catch(err => {
console.error('Ошибка загрузки:', err); // логируем
showErrorToUser('Не удалось загрузить данные');
return fallbackData; // восстанавливаем выполнение
});

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

Начни с ключевого отличия: catch - это обработчик, а console.error - просто вывод. Подчеркни, что необработанные rejection ведут к падению процесса в Node.js. Упомяни, что catch позволяет строить цепочки восстановления и проброса ошибок. Приведи пример из практики: API-запрос с fallback. Если спросят про async/await - объясни, что try/catch там работает аналогично catch у промиса.

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

  • Понимание асинхронного потока и propagation ошибок в промисах
  • Знание разницы между логированием и обработкой
  • Умение проектировать устойчивый код с корректной обработкой ошибок
  • Осознание последствий unhandled promise rejection в разных средах

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

  • Использование console.error в then как второго аргумента вместо catch - это не перехватывает ошибки из предыдущих then
  • Забывание catch в конце цепочки - ошибка остаётся необработанной
  • Путаница между catch и finally: finally не перехватывает ошибку, а только выполняет код после завершения
  • Обработка ошибки только через console.error без восстановления или уведомления пользователя

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

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