Error
Baseline 广泛可用 *
Error 对象在发生运行时错误时被抛出。Error 对象还可以用作用户自定义异常的基础对象。有关标准的内置错误类型,请参阅下文。
描述
运行时错误会导致创建并抛出新的 Error 对象。
Error 是一个可序列化对象,因此可以使用 structuredClone() 进行克隆,或使用 postMessage() 在 Worker 之间进行复制。
错误类型
除了通用的 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 堆栈跟踪 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 对象,这些对象具有更具体的错误消息。原始错误应作为构造函数的可选参数 options 的 cause 属性传递给新的 Error。这确保了原始错误和堆栈跟踪对更高级别的 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;
}
}
注意:如果您正在制作一个库,您应该优先使用错误原因来区分不同的错误,而不是让您的消费者解析错误消息。有关示例,请参阅 错误原因页面。
自定义错误类型也可以使用 cause 属性,前提是子类的构造函数在调用 super() 时传递了 options 参数。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 在异常处理程序中检查错误类型。这样可以使错误处理代码更清晰、更一致。
有关深入讨论,请参阅 Stack Overflow 上的 “What's a good way to extend Error in JavaScript?”。
警告: 内置类的继承无法可靠地转译为 ES6 之前的代码,因为在没有 Reflect.construct() 的情况下,无法使用特定的 new.target 来构造基类。您需要 额外的配置 或在构造函数末尾手动调用 Object.setPrototypeOf(this, CustomError.prototype);否则,构造的实例将不是 CustomError 实例。有关更多信息,请参阅 TypeScript FAQ。
注意:使用 ES2015 类时,某些浏览器会在堆栈跟踪中包含 CustomError 构造函数。
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® 2026 语言规范 # sec-error-objects |
浏览器兼容性
加载中…