語法
Error.captureStackTrace(object)
Error.captureStackTrace(object, constructor)
引數
object-
要在其上新增
stack屬性的物件。 constructor可選-
一個函式,通常是建立
object的建構函式。在收集堆疊跟蹤時,此函式最頂層呼叫之上的所有幀,包括該呼叫本身,都將從堆疊跟蹤中排除。
返回值
無(undefined)。
object 會被就地修改,新增一個名為 stack 的自有屬性,其字串值遵循與 Error.prototype.stack 相同的格式。此屬性是不可列舉且可配置的。在 V8 中,它是一個 getter-setter 對。在 SpiderMonkey 和 JavaScriptCore 中,它是一個可寫的資料屬性。
示例
使用 Error.captureStackTrace()
getStack() 實用函式返回呼叫時的當前堆疊跟蹤,並將其自身從堆疊中移除。這與 console.trace() 具有相同的除錯目的,但允許您將字串輸出到其他地方。請注意,它不會為此目的構造一個 Error 例項,而是將 stack 安裝在一個普通物件上,這對於我們的目的來說更有效率。通常,您會在打算作為錯誤丟擲的物件上呼叫 Error.captureStackTrace,如下一個示例所示。
function getStack() {
const obj = {};
if ("captureStackTrace" in Error) {
// Avoid getStack itself in the stack trace
Error.captureStackTrace(obj, getStack);
}
return obj.stack;
}
function foo() {
console.log(getStack());
}
foo();
// Error
// at foo (<anonymous>:8:15)
// at <anonymous>:11:1
在自定義錯誤物件上安裝堆疊跟蹤
Error.captureStackTrace() 的主要用例是在自定義錯誤物件上安裝堆疊跟蹤。通常,您透過擴充套件 Error 類來定義 自定義錯誤,這會自動透過繼承使 stack 屬性可用。然而,預設堆疊跟蹤的問題是它包含了建構函式呼叫本身,這會洩露實現細節。您可以透過使用 Error.captureStackTrace() 來避免這種情況,它允許即使對於不繼承自 Error 的自定義錯誤也能安裝堆疊跟蹤。
class MyError extends Error {
constructor(message, options) {
super(message, options);
if ("captureStackTrace" in Error) {
// Avoid MyError itself in the stack trace
Error.captureStackTrace(this, MyError);
}
}
}
const myError = new MyError("Something went wrong");
console.log(myError.stack);
// Error: Something went wrong
// at <anonymous>:8:17
請注意,即使您在這裡沒有呼叫 Error.captureStackTrace(),一些引擎仍然足夠智慧,可以避免在堆疊跟蹤中出現 MyError(如果建構函式繼承自 Error)。對於出於某種原因不繼承自 Error 的自定義錯誤,呼叫 Error.captureStackTrace() 更為重要。
class MyError {
constructor(message) {
this.message = message;
if ("captureStackTrace" in Error) {
// Avoid MyError itself in the stack trace
Error.captureStackTrace(this, MyError);
}
}
}
const myError = new MyError("Something went wrong");
console.log(myError.stack);
// Error: Something went wrong
// at <anonymous>:8:17
規範
| 規範 |
|---|
| 未知規範 # errorcapturestacktrace-1 |
瀏覽器相容性
載入中…