Error.captureStackTrace()

Nicht standardisiert: Diese Funktion ist nicht standardisiert und befindet sich nicht auf dem Weg zur Standardisierung. Verwenden Sie sie nicht auf Produktionsseiten, die dem Web ausgesetzt sind: Sie funktioniert nicht für alle Benutzer. Es kann auch große Inkompatibilitäten zwischen Implementierungen geben, und das Verhalten kann sich in Zukunft ändern.

Hinweis: Dieses Feature ist Teil der nicht standardisierten V8 Stack Trace API. Aus Kompatibilitätsgründen wird es jedoch faktisch von allen großen JavaScript-Engines implementiert.

Die statische Methode Error.captureStackTrace() installiert Stapelverfolgungsinformationen auf einem angegebenen Objekt als stack-Eigenschaft.

Syntax

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

Parameter

object

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

constructor Optional

Eine Funktion, typischerweise der Konstruktor, in dem das object erstellt wurde. Beim Sammeln der Stapelverfolgung werden alle Rahmen über dem obersten Aufruf dieser Funktion, einschließlich dieses Aufrufs, aus der Stapelverfolgung ausgeschlossen.

Rückgabewert

Keiner (undefined).

Das object wird direkt mit einer neuen eigenen Eigenschaft namens stack modifiziert, deren String-Wert dasselbe Format wie Error.prototype.stack hat. Diese Eigenschaft ist nicht aufzählbar und konfigurierbar. In V8 ist sie ein Getter-Setter-Paar. In SpiderMonkey und JavaScriptCore ist sie eine beschreibbare Dateneigenschaft.

Beispiele

Verwendung von Error.captureStackTrace()

Die Utility-Funktion getStack() liefert die aktuelle Stapelverfolgung an dem Punkt, an dem sie aufgerufen wird, und entfernt sich selbst aus dem Stapel. Dies dient demselben Debugging-Zweck wie console.trace(), erlaubt es Ihnen jedoch, den String an anderer Stelle auszugeben. Beachten Sie, dass dafür keine Error-Instanz erstellt wird, sondern stack auf ein einfaches Objekt installiert wird, was für unsere Zwecke effizienter ist. Normalerweise würden Sie Error.captureStackTrace auf Objekte anwenden, die als Fehler geworfen werden sollen, wie im nächsten Beispiel gezeigt.

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 der Stapelverfolgung auf einem benutzerdefinierten Fehlerobjekt

Der Hauptanwendungsfall für Error.captureStackTrace() ist die Installation einer Stapelverfolgung auf einem benutzerdefinierten Fehlerobjekt. Typischerweise definieren Sie benutzerdefinierte Fehler, indem Sie die Error-Klasse erweitern, die automatisch die stack-Eigenschaft per Vererbung verfügbar macht. Das Problem bei der Standard-Stapelverfolgung ist jedoch, dass sie den Konstruktoraufruf selbst enthält, wodurch Implementierungsdetails preisgegeben werden. Dies können Sie vermeiden, indem Sie Error.captureStackTrace() verwenden, das ermöglicht, die Stapelverfolgung 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 einige Engines, selbst wenn Sie hier nicht Error.captureStackTrace() aufrufen, intelligent genug sind, MyError aus der Stapelverfolgung zu entfernen, 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

No specification found

No specification data found for javascript.builtins.Error.captureStackTrace.
Check for problems with this page or contribute a missing spec_url to mdn/browser-compat-data. Also make sure the specification is included in w3c/browser-specs.

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch