Error.captureStackTrace()
Die statische Methode Error.captureStackTrace()
installiert Stack-Trace-Informationen auf einem bereitgestellten Objekt als die stack
-Eigenschaft.
Syntax
Error.captureStackTrace(object)
Error.captureStackTrace(object, constructor)
Parameter
object
-
Das Objekt, auf dem die
stack
-Eigenschaft hinzugefügt wird. constructor
Optional-
Eine Funktion, typischerweise der Konstruktor, wo das
object
erstellt wurde. Beim Sammeln des Stack-Traces werden alle Frames oberhalb des obersten Aufrufs dieser Funktion, einschließlich dieses Aufrufs, aus dem Stack-Trace ausgeschlossen.
Rückgabewert
Keiner (undefined
).
Das object
wird vor Ort mit einer zusätzlichen eigenen Eigenschaft namens stack
modifiziert, deren Zeichenkettenwert dasselbe Format wie Error.prototype.stack
hat. Diese Eigenschaft ist nicht aufzählbar und konfigurierbar. In V8 ist es ein Getter-Setter-Paar. In SpiderMonkey und JavaScriptCore ist es eine Daten-Eigenschaft, die beschreibbar ist.
Beispiele
Verwendung von Error.captureStackTrace()
Die getStack()
-Hilfsfunktion gibt den aktuellen Stack-Trace an dem Punkt zurück, an dem sie aufgerufen wird, und entfernt sich selbst aus dem Stack. Dies erfüllt denselben Debugging-Zweck wie console.trace()
, ermöglicht es Ihnen jedoch, die Zeichenkette an anderer Stelle auszugeben. Beachten Sie, dass hierfür keine Error
-Instanz erstellt wird, sondern stack
auf einem einfachen Objekt installiert wird, was effizienter für unsere Zwecke wäre. Normalerweise würden Sie Error.captureStackTrace
bei Objekten aufrufen, die als Fehler geworfen werden sollen, wie im nächsten Beispiel gezeigt.
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 des Stack-Traces auf einem benutzerdefinierten Fehlerobjekt
Der Hauptanwendungsfall für Error.captureStackTrace()
besteht darin, einen Stack-Trace auf einem benutzerdefinierten Fehlerobjekt zu installieren. Typischerweise definieren Sie benutzerdefinierte Fehler durch Erweitern der Error
-Klasse, die automatisch die stack
-Eigenschaft über Vererbung verfügbar macht. Das Problem mit dem Standard-Stack-Trace ist jedoch, dass er den Konstruktoraufruf selbst enthält, der 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.
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 Error.captureStackTrace()
hier nicht aufrufen, einige Engines dennoch klug genug sind, um MyError
im Stack-Trace zu vermeiden, wenn der Konstruktor von Error
erbt. Das Aufrufen von Error.captureStackTrace()
ist wichtiger für benutzerdefinierte Fehler, die aus irgendeinem Grund nicht von Error
erben.
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
Error.prototype.stack
Error.stackTraceLimit
- Stack trace API in der V8-Dokumentation