Error() 构造函数

Error() 构造函数能够创建一个包含错误信息的对象。

语法

js
new Error()
new Error(message)
new Error(message, options)
new Error(message, fileName)
new Error(message, fileName, lineNumber)
Error()
Error(message)
Error(message, options)
Error(message, fileName)
Error(message, fileName, lineNumber)

备注: 调用 Error() 时,可以使用关键字 new,也可以不使用。两种声明方式均能创建一个新的 Error 实例。

参数

message 可选

人类可读的错误信息。

options 可选

一个包含以下属性的对象:

cause 可选

指示错误的具体原因,反映在 cause 属性中。当捕获并重新抛出带有更具体或有用的错误消息的错误时,可以使用此属性传递原始错误。

fileName 可选 非标准

引发此错误的文件路径,反映在 fileName 属性中。默认为调用 Error() 构造函数的代码所在文件的名称。

lineNumber 可选 非标准

引发错误的文件中的行号,反映在 lineNumber 属性中。默认为包含 Error() 构造函数调用的行号。

示例

函数调用与构造函数

Error 作为函数使用,即不包含 new 关键字时,它将返回一个 Error 对象。因此,直接调用 Error 函数将产生与使用 new 关键字构造 Error 对象相同的输出。

js
const x = Error("I was created using a function call!");
// 上述代码与以下代码具有相同的功能
const y = new Error('I was constructed via the "new" keyword!');

使用 cause 重新抛出错误

在捕获错误时,我们可能会使用新的错误信息对错误进行包装,再将其重新抛出。这种场景下,你应当将原始错误也传入新的 Error 的构造函数,如下所示:

js
try {
  frameworkThatCanThrow();
} catch (err) {
  throw new Error("New error message", { cause: err });
}

更多示例参考错误 > 区分相似的错误

省略 options 参数

JavaScript 只有在 options 参数为对象时才会尝试读取 options.cause 属性,这样可以避免与另一种非标准的 Error(message, fileName, lineNumber) 函数签名产生歧义,后者要求第二个参数必须是字符串。如果你省略了 options 参数,或者将原始值作为 options 传入,又或者传递的对象中没有 cause 属性,那么创建的 Error 对象将不会包含 cause 属性。

js
// 省略 options
const error1 = new Error("Error message");
console.log("cause" in error1); // false

// 传递原始值
const error2 = new Error("Error message", "");
console.log("cause" in error2); // false

// 传递不包含 cause 属性的对象
const error3 = new Error("Error message", { details: "http error" });
console.log("cause" in error3); // false

规范

Specification
ECMAScript Language Specification
# sec-error-constructor

浏览器兼容性

BCD tables only load in the browser

参见