В чем разница между throw 'message' и throw new Error('message')?

Чем отличаются throw 'message' и throw new Error('message')? throw 'message': выбрасывает примитив string и не формирует стек ошибки throw new Error('message'): создаёт объект Error со стеком вызовов Error…

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

Что ответить на собеседовании

Чем отличаются throw 'message' и throw new Error('message')? throw 'message': выбрасывает примитив string и не формирует стек ошибки throw new Error('message'): создаёт объект Error со стеком вызовов Error предоставляет диагностические данные: stack trace и имя ошибки объекты Error удобнее перехватывать и записывать в логи это соответствует принятой практике JavaScript и Node.js и упрощает отладку throw 'message' хуже объясняет причину сбоя и затрудняет трассировку для единообразия и диагностики обычно выбирают throw new Error

Подробный разбор

Ответ с пояснениями

Чем отличаются throw 'message' и throw new Error('message')?

  • throw 'message': выбрасывает примитив string и не формирует стек ошибки
  • throw new Error('message'): создаёт объект Error со стеком вызовов
  • Error предоставляет диагностические данные: stack trace и имя ошибки
  • объекты Error удобнее перехватывать и записывать в логи
  • это соответствует принятой практике JavaScript и Node.js и упрощает отладку
  • throw 'message' хуже объясняет причину сбоя и затрудняет трассировку
  • для единообразия и диагностики обычно выбирают throw new Error

Развёрнутый ответ

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

В JavaScript различие между throw 'message' и throw new Error('message') определяется типом выбрасываемого значения. В первом варианте исключением становится обычная строка, а во втором создаётся объект класса Error. Помимо сообщения, такой объект содержит данные, полезные при отладке, включая стек вызовов.

Основные особенности

  • Тип исключения: throw 'message' передаёт строку без метаданных. Выражение throw new Error('message') создаёт полноценный объект с полями message, name и свойством stack, поэтому причину сбоя искать проще.
  • Перехват и проверка: объект Error позволяет удобнее определять тип исключения через instanceof Error. При выбросе строки остаётся ориентироваться на её текст, что менее надёжно и менее удобно.
  • Совместимость и стандарты: общепринятый подход в JavaScript — выбрасывать объекты Error либо их наследников, например TypeError и RangeError. Это повышает понятность и упрощает сопровождение кода.

Пример из практики

В production-коде почти всегда используют throw new Error(...) или собственные классы ошибок. Так проще журналировать сбои, например отправлять их в Sentry, и анализировать их при отладке. Выброс строк встречается редко — главным образом в простых учебных примерах, поскольку он усложняет диагностику и делает поведение системы менее предсказуемым.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку