Error

Baseline 广泛可用 *

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

* 此特性的某些部分可能存在不同级别的支持。

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"。像 TypeErrorSyntaxError 这样的子类会提供自己的 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 结构来处理错误。

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

处理特定类型的错误

您可以通过使用 instanceof 关键字测试错误类型来选择仅处理特定类型的错误。

js
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 对象,这些对象具有更具体的错误消息。原始错误应作为构造函数的可选参数 optionscause 属性传递给新的 Error。这确保了原始错误和堆栈跟踪对更高级别的 try/catch 块可用。

下面的示例展示了针对两种原本会因相似错误而失败的方法(doFailSomeWay()doFailAnotherWay())如何处理此问题。

js
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 属性。

js
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 构造函数。

js
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

浏览器兼容性

另见