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

瀏覽器相容性

另見