Разница между

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Когда вы создаёте исключение с помощью new Error, вы получаете объект ошибки со всеми необходимыми для отладки данными, включая ценнейший стек вызовов. Это считается рекомендуемым подходом, поскольку он упрощает процесс диагностики. throw someObject, в свою очередь, позволяет выбросить любой объект, но информация о стеке вызовов исчезнут, что может создать затруднения для разработчика.

Пример кода:

JS
Скопировать код
// Бросаем исключение с детальным стеком вызовов и замечанием, пропитанным черным юмором. 
throw new Error('Ошибка: детали превосходят все ожидания!');

// Бросаем произвольный объект, который может содержать неожиданные данные,
// например, послание из печенья с предсказаниями... (но помните про потерю стека!)
throw { msg: 'Ошибка: завелся в неизведанной местности! SOS!', helper: "Уменье отлаживать код не помешает" };

Вывод: использование new Error идеально подходит для глубокой отладки, в то время как someObject предназначен для передачи специфических сообщений об ошибках с потерей стека вызовов.

Кинга Идем в IT: пошаговый план для смены профессии

Подробное сравнение

Совместимость объектов Error в различных браузерах

Благодаря использованию throw new Error, JavaScript немедленно создаёт объект ошибки с стеком вызовов. Детализация ошибки ведёт себя одинаково во всех браузерах, что можно сравнить с зарядом бодрости от хорошего кофе в процессе отладки.

Гибкость в работе с объектами

Механизм throw someObject позволяет передавать любые данные, актуальные для контекста вашего приложения. Но плата за такую гибкость – потеря трассировочного стека, что сделает процесс отладки схожим с блужданием в тёмном лабиринте.

Сериализация ваших ошибок

Для систем логирования или отладочных средств, сериализация ошибок играет важную роль. Стандартные new Error гарантируют удобство в этом процессе. Напротив, выбрасывание примитивных объектов или строк может привести к нежелательной непредсказуемости, напоминающей капризную погоду.

Различие в названиях объектов ошибок

Название объекта ошибки может быть одним из шести вариантов: EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError. Эти наименования помогают быстрее ориентироваться и выбрать подход к отладке.

Создание персонализированных исключений в блоках catch

Создание пользовательских исключений в JavaScript позволяет вам контролировать поток выполнения внутри блоков catch. Теперь вы способны обрабатывать нестандартные ситуации в вашем коде так же просто, как будто кто-то забыл наполнить кофе-машину.

Применение объектов ошибок ведет к успешной отладке

Независимо от того, собираетесь ли вы внедрять код или готовитесь к внушительной ночной сессии, выбор объектов Error будет наиболее эффективным. Они не только точно сообщают о природе и контексте ошибки, но также гарантированно совместимы с механизмами обработки исключений, такими как try/catch и Promises.

Визуализация

...

Внедрение продвинутых стратегий обработки ошибок

Создание приспособленных классов ошибок

Для углубленной настройки имеет смысл определить свои классы ошибок. Подобный подход заметно облегчает процесс отладки, добавляя дополнительный контекст и регулирование поведения.

Например, определение класса CustomError может выглядеть так:

JS
Скопировать код
class CustomError extends Error {
  constructor(message, code) {
    super(message);
    this.code = code;
  }
}

try {
  // Пришло время для исключений!
  throw new CustomError('Что-то пошло не так!', 500);
} catch (e) {
  // Мы поймали ошибку, всё под контролем.
}

Использование адаптированных ошибок позволяет придерживаться принципа разделения ответственности, вынося обработку исключительных ситуаций в отдельный блок кода.

Обработка ошибок в промисах

При работе с промисами обязательно использование .catch() или сочетания async/await и try/catch для обработки ошибок.

JS
Скопировать код
myAsyncFunction()
  .then(result => {
    // Результат обработан, можно радоваться.
  })
  .catch(error => {
    // Произошла ошибка, работа продолжается.
  });

Каждая ошибка в промисах требует внимательного отношения, чтобы адекватно реагировать на исключения.

Единая стратегия обработки ошибок

Если в вашем коде есть много потенциальных источников ошибок, централизованная обработка может оказаться удачным решением. В роли "старшего брата" вашего кода может выступать глобальный обработчик или промежуточное ПО в Express.js. Этот подход обеспечивает порядок, упорядочивает работу и упрощает взаимодействие с пользователем.

Полезные материалы

...