Error
Baseline Widely available *
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
* Some parts of this feature may have varying levels of support.
Экземпляры объекта Error
выбрасываются при возникновении ошибок во время выполнения. Объект Error
также может использоваться в качестве базового для пользовательских исключений. Смотрите ниже стандартные встроенные типы ошибок.
Описание
Во время выполнения кода ошибки приводят к созданию и выбрасыванию новых объектов Error
.
Error
является сериализуемым объектом, поэтому он может быть клонирован с помощью structuredClone()
или передан между воркерами с использованием postMessage()
.
Типы ошибок
Кроме общего конструктора Error
, в JavaScript существуют другие встроенные конструкторы ошибок, смотрите раздел Выражения обработки исключений.
EvalError
-
Создаёт экземпляр, представляющий ошибку, возникающую в глобальной функции
eval()
. RangeError
-
Создаёт экземпляр, представляющий ошибку, возникающую при выходе числовой переменной или параметра за пределы допустимого диапазона.
ReferenceError
-
Создаёт экземпляр, представляющий ошибку, возникающую при разыменовывании недопустимой ссылки.
SyntaxError
-
Создаёт экземпляр, представляющий синтаксическую ошибку, возникающую при разборе исходного кода в функции
eval()
. TypeError
-
Создаёт экземпляр, представляющий ошибку, возникающую при недопустимом типе для переменной или параметра.
URIError
-
Создаёт экземпляр, представляющий ошибку, возникающую при передаче в функции
encodeURI()
илиdecodeURI()
недопустимых параметров. AggregateError
-
Создаёт экземпляр, представляющий несколько ошибок, обёрнутых в одну. Может быть полезно, например, при работе с
Promise.any()
. InternalError
Не стандартно-
Создаёт экземпляр, представляющий ошибку, возникающую при выбрасывании внутренней ошибки в движке JavaScript. К примеру, ошибки «слишком глубокая рекурсия» («too much recursion»).
Конструктор
Error()
-
Создаёт новый объект
Error
.
Статические методы
Error.captureStackTrace()
Не стандартно-
Нестандартная функция V8, которая создаёт свойство
stack
у экземпляраError
. Error.stackTraceLimit
Не стандартно-
Нестандартное числовое свойство V8, которое ограничивает количество уровней ошибок, включаемых в трассировку стека.
Error.prepareStackTrace()
Не стандартно Необязательный-
Нестандартная функция V8, которая (если задана в пользовательском коде) вызывается JavaScript-движком V8 для выбрасывание исключений, позволяя определять нестандартное форматирование трассировки стека.
Свойства экземпляра
Эти свойства определены в Error.prototype
и есть у всех экземпляров Error
.
Error.prototype.constructor
-
Функция-конструктор, создающая экземпляр объекта. Для экземпляров
Error
начальным значением является конструкторError
. Error.prototype.name
-
Представляет название типа ошибки. Начальным значением
Error.prototype.name
является"Error"
. Подклассы (например,TypeError
иSyntaxError
) имеют собственные значения свойстваname
. Error.prototype.stack
Не стандартно-
Нестандартное свойство, содержащее трассировку стека.
Эти свойства являются собственными свойствами каждого экземпляра Error
.
cause
-
Нестандартное свойство Mozilla, определяющее номер символа в строке, в которой возникла ошибка.
-
Причина возникновения текущей ошибки — обычно это другая обнаруженная ошибка. Для созданных пользователем объектов
Error
это значение свойстваcause
второго аргумента конструктора. fileName
Не стандартно-
Нестандартное свойство Mozilla, определяющее путь к файлу, в котором возникла ошибка.
lineNumber
Не стандартно-
Нестандартное свойство Mozilla, определяющее номер строки в файле, где возникла ошибка.
message
-
Сообщение об ошибке. Для созданных пользователем объектов
Error
это строка, передаваемая в качестве первого аргумента конструктора.
Методы экземпляра
Error.prototype.toString()
-
Возвращает строку, представляющую указанный объект. Переопределяет метод
Object.prototype.toString()
.
Примеры
Выбрасывание обычной ошибки
Обычно, вы создаёте объект Error
с намерением возбудить ошибку с помощью ключевого слова throw
. Вы можете обработать ошибку с помощью конструкции try...catch
:
try {
throw new Error("Ой!");
} 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}`);
}
// и так далее
else {
// Если ни один из типов не совпал, то оставляем ошибку необработанной
throw e;
}
}
Пользовательские типы ошибок
Вы можете захотеть определить свои собственные типы ошибок, унаследованные от Error
, чтобы иметь возможность возбуждать их с помощью throw new MyError()
и использовать instanceof MyError
для проверки вида ошибки в обработчике исключений. Это помогает делать обработку ошибок более понятной.
Также смотрите обсуждение «Какой способ расширения Error в JavaScript более предпочтителен?» на StackOverflow.
Предупреждение:
Встроенные подклассы не могут быть надёжно преобразованы в ES6 код, потому что нет возможности создать базовый класс со специфичным new.target
без Reflect.construct()
. Требуется дополнительная конфигурация или ручной вызов Object.setPrototypeOf(this, CustomError.prototype)
в конце конструктора, иначе создаваемый экземпляр не будет экземпляром CustomError
. Смотрите TypeScript FAQ для получения дополнительной информации.
Примечание:
Некоторые браузеры включают конструктор CustomError
в трассировку стека при использовании классов ES2015.
class CustomError extends Error {
constructor(foo = "bar", ...params) {
// Передаём все аргументы (включая специфичные для производителя движка) родительскому конструктору
super(...params);
// Поддерживаем соответствующую трассировку стека с указанием места возникновения ошибки (доступно только в V8)
if (Error.captureStackTrace) {
Error.captureStackTrace(this, CustomError);
}
this.name = "CustomError";
// Дополнительная отладочная информация
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); // stacktrace
}
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-error-objects |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
- Полифил
Error
с поддержкойcause
вcore-js
throw
try...catch
- Stack trace API в документации V8