Spec-Zone.ru › JavaScript

Ошибка

Базовая поддержка Широко доступно

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.

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

Описание

Ошибки времени выполнения приводят к созданию и генерации новых объектов Error.

Error является сериализуемым объектом, поэтому его можно клонировать с помощью structuredClone() или скопировать между Workers с использованием postMessage().

Типы ошибок

Помимо универсального конструктора Error, в JavaScript существуют и другие основные конструкторы ошибок. Информацию об исключениях на стороне клиента см. в разделе Операторы обработки исключений.

EvalError
Создает экземпляр, представляющий ошибку, которая возникает в связи с глобальной функцией eval().
RangeError
Создает экземпляр, представляющий ошибку, которая возникает, когда числовая переменная или параметр выходит за пределы допустимого диапазона.
ReferenceError
Создает экземпляр, представляющий ошибку, которая возникает при разыменовании недопустимой ссылки.
SyntaxError
Создает экземпляр, представляющий синтаксическую ошибку.
TypeError
Создает экземпляр, представляющий ошибку, которая возникает, когда переменная или параметр имеет недопустимый тип.
URIError
Создает экземпляр, представляющий ошибку, которая возникает, когда в encodeURI() или decodeURI() переданы недопустимые параметры.
AggregateError
Создает экземпляр, представляющий несколько ошибок, объединенных в одну, когда операция должна сообщить о нескольких ошибках, например, при использовании Promise.any().
InternalError Нестандартно
Создает экземпляр, представляющий ошибку, которая возникает при генерации внутренней ошибки в движке JavaScript. Например, "слишком большая рекурсия".

Конструктор

Error()
Создает новый объект Error.

Статические свойства

Error.stackTraceLimit Нестандартно
Нестандартное числовое свойство, которое ограничивает количество фреймов стека, включаемых в трассировку стека ошибки.

Статические методы

Error.captureStackTrace()
Нестандартная функция, которая создает свойство stack в предоставленном объекте.
Error.isError()
Возвращает true, если аргумент является ошибкой, или false в противном случае.
Error.prepareStackTrace() Нестандартно Опционально
Нестандартная функция, которая, если предоставлена пользовательским кодом, вызывается движком JavaScript для сгенерированных исключений, позволяя пользователю предоставить пользовательское форматирование для трассировок стека. См. документацию V8 Stack Trace API.

Свойства экземпляра

Эти свойства определены на Error.prototype и общие для всех экземпляров Error.

Error.prototype.constructor
Функция-конструктор, создавшая объект-экземпляр. Для экземпляров Error начальным значением является конструктор Error.
Error.prototype.name
Представляет имя типа ошибки. Для Error.prototype.name начальное значение — "Error". Подклассы, такие как TypeError и SyntaxError, предоставляют свои собственные свойства name.
Error.prototype.stack Нестандартно
Нестандартное свойство для трассировки стека.

Эти свойства являются собственными свойствами каждого экземпляра Error.

cause
Причина ошибки, указывающая, почему была сгенерирована текущая ошибка — обычно это другая перехваченная ошибка. Для объектов Error, созданных пользователем, это значение, предоставленное в качестве свойства cause второго аргумента конструктора.
columnNumber Нестандартно
Нестандартное свойство Mozilla для номера столбца в строке, вызвавшей эту ошибку.
fileName Нестандартно
Нестандартное свойство Mozilla для пути к файлу, вызвавшему эту ошибку.
lineNumber Нестандартно
Нестандартное свойство Mozilla для номера строки в файле, вызвавшем эту ошибку.
message
Сообщение об ошибке. Для объектов Error, созданных пользователем, это строка, предоставленная в качестве первого аргумента конструктора.

Методы экземпляра

Error.prototype.toString()
Возвращает строку, представляющую указанный объект. Переопределяет метод Object.prototype.toString().

Примеры

Генерация универсальной ошибки

Обычно вы создаете объект Error с намерением сгенерировать его с помощью ключевого слова throw. Вы можете обработать ошибку, используя конструкцию try...catch:

try {
  throw new Error("Whoops!");
} catch (e) {
  console.error(`${e.name}: ${e.message}`);
}

Обработка определенного типа ошибки

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

try {
  foo.bar();
} catch (e) {
  if (e instanceof EvalError) {
    console.error(`${e.name}: ${e.message}`);
  } else if (e instanceof RangeError) {
    console.error(`${e.name}: ${e.message}`);
  }
  // etc.
  else {
    // If none of our cases matched leave the Error unhandled
    throw e;
  }
}

Различие между похожими ошибками

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

Если вы не контролируете исходные генерируемые ошибки, один из вариантов — перехватить их и сгенерировать новые объекты Error, которые содержат более конкретные сообщения. Исходная ошибка должна быть передана в новый Error в параметре options конструктора как его свойство cause. Это гарантирует, что исходная ошибка и трассировка стека будут доступны блокам try/catch более высокого уровня.

Пример ниже показывает это для двух методов, которые в противном случае завершились бы с похожими ошибками (doFailSomeWay() и doFailAnotherWay()):

function doWork() {
  try {
    doFailSomeWay();
  } catch (err) {
    throw new Error("Failed in some way", { cause: err });
  }
  try {
    doFailAnotherWay();
  } catch (err) {
    throw new Error("Failed in another way", { cause: err });
  }
}

try {
  doWork();
} catch (err) {
  switch (err.message) {
    case "Failed in some way":
      handleFailSomeWay(err.cause);
      break;
    case "Failed in another way":
      handleFailAnotherWay(err.cause);
      break;
  }
}

Примечание: Если вы создаете библиотеку, вам следует предпочесть использование причины ошибки (error cause) для различения генерируемых ошибок, а не требовать от ваших потребителей парсить сообщение об ошибке. Пример см. на странице причины ошибки.

Пользовательские типы ошибок также могут использовать свойство cause, при условии, что конструктор подкласса передает параметр options при вызове super(). Конструктор базового класса Error() считает options.cause и определит свойство cause в новом экземпляре ошибки.

class MyError extends Error {
  constructor(message, options) {
    // Need to pass `options` as the second parameter to install the "cause" property.
    super(message, options);
  }
}

console.log(new MyError("test", { cause: new Error("cause") }).cause);
// Error: cause

Пользовательские типы ошибок

Вы можете захотеть определить свои собственные типы ошибок, производные от Error, чтобы иметь возможность throw new MyError() и использовать instanceof MyError для проверки типа ошибки в обработчике исключений. Это приводит к более чистому и последовательному коду обработки ошибок.

См. "What's a good way to extend Error in JavaScript?" на Stack Overflow для углубленного обсуждения.

Предупреждение: Встроенное создание подклассов не может быть надежно транспилировано в код до ES6, поскольку невозможно создать базовый класс с конкретным new.target без Reflect.construct(). Вам потребуется дополнительная конфигурация или ручной вызов Object.setPrototypeOf(this, CustomError.prototype) в конце конструктора; в противном случае созданный экземпляр не будет экземпляром CustomError. Дополнительную информацию см. в FAQ TypeScript.

Примечание: Некоторые браузеры включают конструктор CustomError в трассировку стека при использовании классов ES2015.

class CustomError extends Error {
  constructor(foo = "bar", ...params) {
    // Pass remaining arguments (including vendor specific ones) to parent constructor
    super(...params);

    // Maintains proper stack trace for where our error was thrown (non-standard)
    if (Error.captureStackTrace) {
      Error.captureStackTrace(this, CustomError);
    }

    this.name = "CustomError";
    // Custom debugging information
    this.foo = foo;
    this.date = new Date();
  }
}

try {
  throw new CustomError("baz", "bazMessage");
} catch (e) {
  console.error(e.name); // CustomError
  console.error(e.foo); // baz
  console.error(e.message); // bazMessage
  console.error(e.stack); // stack trace
}

Спецификации

Спецификация
ECMAScript® 2027 Language Specification
# sec-error-objects

Совместимость с браузерами

Десктопные Мобильные Серверные
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
Error
1
12
1
4
1
18
4
10.1
1
1.0
4.4
1
1.0.0
1.0
0.10.0
Error
1
12
1
4
1
18
4
10.1
1
1.0
4.4
1
1.0.0
1.0
0.10.0
captureStackTrace
3
79
138
15
17.2
18
138
14
17.2
1.0
4.4
17.2
1.0.0
1.0
0.10.0
cause
93До версии 125 стандартное журналирование консоли для объектов Error не выводит причину.
93До версии 125 стандартное журналирование консоли для объектов Error не выводит причину.
91
79До версии 111 стандартное журналирование консоли для объектов Error не выводит причину.
15Стандартное журналирование консоли для объектов Error не выводит причину.
93До версии 125 стандартное журналирование консоли для объектов Error не выводит причину.
91
66До версии 83 стандартное журналирование консоли для объектов Error не выводит причину.
15Стандартное журналирование консоли для объектов Error не выводит причину.
17.0До версии 27.0 стандартное журналирование консоли для объектов Error не выводит причину.
93До версии 125 стандартное журналирование консоли для объектов Error не выводит причину.
15Стандартное журналирование консоли для объектов Error не выводит причину.
1.0.0
1.13
16.9.0
columnNumber
Нет
Нет
1
Нет
Нет
Нет
4
Нет
Нет
Нет
Нет
Нет
?
Нет
Нет
fileName
Нет
Нет
1
Нет
Нет
Нет
4
Нет
Нет
Нет
Нет
Нет
?
Нет
Нет
isError
134
134
138
119
18.4Возвращает false для экземпляров DOMException. См. ошибку 292727.
134
138
88
18.4Возвращает false для экземпляров DOMException. См. ошибку 292727.
29.0
134
18.4Возвращает false для экземпляров DOMException. См. ошибку 292727.
1.1.39Возвращает false для экземпляров DOMException. См. проблему 15821.
2.2
24.3.0
24.0.0–24.3.0Возвращает false для экземпляров DOMException. См. проблему 56497.
lineNumber
Нет
Нет
1
Нет
Нет
Нет
4
Нет
Нет
Нет
Нет
Нет
?
Нет
Нет
message
1
12
1
5
1
18
4
10.1
1
1.0
4.4
1
1.0.0
1.0
0.10.0
name
1
12
1
4
1
18
4
10.1
1
1.0
4.4
1
1.0.0
1.0
0.10.0
serializable_object
77
79
103В версии 103 сериализованные свойства: name, message, cause, fileName, lineNumber и columnNumber.
В версии 104 добавлена сериализация stack в основном потоке (window.postMessage() и structuredClone()).
В версии 110 добавлена сериализация stack в воркерах (worker.postMessage() и structuredClone()).
64
Нет
77
103В версии 103 сериализованные свойства: name, message, cause, fileName, lineNumber и columnNumber.
В версии 104 добавлена сериализация stack в основном потоке (window.postMessage() и structuredClone()).
В версии 110 добавлена сериализация stack в воркерах (worker.postMessage() и structuredClone()).
55
Нет
12.0
77
77
Нет
?
Нет
Нет
stack
3
12
1
10.5
6
18
4
11
6
1.0
4.4
6
1.0.0
1.0
0.10.0
stackTraceLimit
3
79
153
15
11.1
18
153
14
11.3
1.0
4.4
11.3
1.0.0
Нет
16.17.0
toString
1
12
1
4
1
18
4
10.1
1
1.0
4.4
1
1.0.0
1.0
0.10.0

См. также

  • Полифил Error с поддержкой cause в core-js
  • Полифил es-shims для Error cause
  • throw
  • try...catch
  • API трассировки стека в документации V8

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API