Error.captureStackTrace()

Die statische Methode Error.captureStackTrace() installiert Stack-Trace-Informationen auf einem bereitgestellten Objekt als die stack Eigenschaft.

Syntax

js
Error.captureStackTrace(object)
Error.captureStackTrace(object, constructor)

Parameter

object

Das Objekt, an dem die stack-Eigenschaft hinzugefügt wird.

constructor Optional

Eine Funktion, typischerweise der Konstruktor, in dem das object erstellt wurde. Beim Erfassen des Stack-Traces werden alle Frames oberhalb des obersten Aufrufs dieser Funktion, einschließlich dieses Aufrufs, aus dem Stack-Trace herausgelassen.

Rückgabewert

Keiner (undefined).

Das object wird vor Ort mit einer zusätzlichen eigenen Eigenschaft namens stack modifiziert, deren Zeichenfolgenwert das gleiche Format wie Error.prototype.stack hat. Diese Eigenschaft ist nicht enumerierbar und konfigurierbar. In V8 ist es ein Getter-Setter-Paar. In SpiderMonkey und JavaScriptCore ist es eine dateneigenschaft, die beschreibbar ist.

Beispiele

Verwendung von Error.captureStackTrace()

Die getStack() Dienstprogrammfunktion gibt den aktuellen Stack-Trace an dem Punkt zurück, an dem sie aufgerufen wird, und entfernt sich selbst aus dem Stack. Dies dient dem gleichen Debugging-Zweck wie console.trace(), ermöglicht es Ihnen jedoch, die Zeichenfolge an anderer Stelle auszugeben. Beachten Sie, dass sie zu diesem Zweck keine Error Instanz erstellt, sondern stack auf einem einfachen Objekt installiert, was für unsere Zwecke effizienter wäre. Normalerweise würden Sie Error.captureStackTrace für Objekte aufrufen, die als Fehler geworfen werden sollen, wie im nächsten Beispiel gezeigt wird.

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

Installation eines Stack-Traces auf einem benutzerdefinierten Fehlerobjekt

Der Hauptanwendungsfall für Error.captureStackTrace() ist die Installation eines Stack-Traces auf einem benutzerdefinierten Fehlerobjekt. Typischerweise definieren Sie benutzerdefinierte Fehler, indem Sie die Error Klasse erweitern, was die stack-Eigenschaft automatisch durch Vererbung verfügbar macht. Das Problem beim Standard-Stack-Trace ist jedoch, dass er den Konstruktoraufruf selbst einschließt, was Implementierungsdetails preisgibt. Dies können Sie vermeiden, indem Sie Error.captureStackTrace() verwenden, das es ermöglicht, den Stack-Trace auch für benutzerdefinierte Fehler zu installieren, die nicht von Error erben.

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

Beachten Sie, dass selbst wenn Sie hier nicht Error.captureStackTrace() aufrufen, einige Engines dennoch intelligent genug sind, MyError aus dem Stack-Trace zu vermeiden, wenn der Konstruktor von Error erbt. Der Aufruf von Error.captureStackTrace() ist wichtiger für benutzerdefinierte Fehler, die aus irgendeinem Grund nicht von Error erben.

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

Spezifikationen

Specification
Unknown specification
# errorcapturestacktrace-1

Browser-Kompatibilität

Siehe auch