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 |
瀏覽器相容性
載入中…