Ошибка
Базовая поддержка Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 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
}
Спецификации
Совместимость с браузерами
| Десктопные | Мобильные | Серверные | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 |
134 |
138 |
88 |
29.0 |
134 |
2.2 |
24.3.0
|
|||||
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 throwtry...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