Error.captureStackTrace()

Error.captureStackTrace() 靜態方法在提供的物件上安裝堆疊跟蹤資訊,作為 stack 屬性。

語法

js
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,如下一個示例所示。

js
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 的自定義錯誤也能安裝堆疊跟蹤。

js
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() 更為重要。

js
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

瀏覽器相容性

另見