Error.prototype.stack
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:
Die stack
-Eigenschaft wird de facto von allen großen JavaScript-Engines implementiert, und das JavaScript-Standardisierungskomitee plant, sie zu standardisieren. Aufgrund von Implementierungsinkonsistenzen können Sie sich nicht auf den genauen Inhalt der Stapelzeichenfolge verlassen, aber Sie können generell davon ausgehen, dass sie existiert und zu Debugging-Zwecken verwendet werden kann.
Die nicht standardisierte stack
-Eigenschaft einer Error
-Instanz bietet eine Rückverfolgung, welche Funktionen in welcher Reihenfolge, von welcher Zeile und Datei und mit welchen Argumenten aufgerufen wurden. Die Stapelzeichenfolge beginnt bei den neuesten Aufrufen und führt zurück zu den ursprünglichen globalen Bereichsaufrufen.
Wert
Ein String.
Da die stack
-Eigenschaft nicht standardisiert ist, unterscheiden sich die Implementierungen bezüglich der Stelle, an der sie installiert wird.
- In Firefox ist sie eine Accessor-Eigenschaft auf
Error.prototype
. - In Chrome und Safari ist sie eine Dateneigenschaft auf jeder
Error
-Instanz, mit dem Deskriptor:
Eigenschaften von Error.prototype.stack | |
---|---|
Schreibbar | ja |
Aufzählbar | nein |
Konfigurierbar | ja |
Beschreibung
Jede JavaScript-Engine verwendet ihr eigenes Format für Stapeltraces, aber sie sind in ihrer allgemeinen Struktur relativ konsistent. Jede Implementierung verwendet eine separate Zeile im Stapel, um jeden Funktionsaufruf darzustellen. Der Aufruf, der direkt den Fehler verursacht hat, wird oben platziert, und der Aufruf, der die gesamte Aufrufkette gestartet hat, wird unten platziert. Unten sind einige Beispiele für Stapeltraces:
function foo() {
bar();
}
function bar() {
baz();
}
function baz() {
console.log(new Error().stack);
}
foo();
#### JavaScriptCore baz@filename.js:10:24 bar@filename.js:6:6 foo@filename.js:2:6 global code@filename.js:13:4 #### SpiderMonkey baz@filename.js:10:15 bar@filename.js:6:3 foo@filename.js:2:3 @filename.js:13:1 #### V8 Error at baz (filename.js:10:15) at bar (filename.js:6:3) at foo (filename.js:2:3) at filename.js:13:1
Verschiedene Engines setzen diesen Wert zu unterschiedlichen Zeiten. Die meisten modernen Engines setzen ihn, wenn das Error
-Objekt erstellt wird. Das bedeutet, dass Sie die vollständige Anruf-Stack-Information innerhalb einer Funktion wie folgt erhalten können:
function foo() {
console.log(new Error().stack);
}
Ohne einen Fehler werfen und dann abfangen zu müssen.
In V8 können die nicht standardisierten Error.captureStackTrace()
, Error.stackTraceLimit
und Error.prepareStackTrace()
APIs verwendet werden, um den Stapeltrace anzupassen. Lesen Sie die Stack trace API in den V8-Dokumenten für weitere Informationen.
Stapelrahmen können auch andere Dinge als explizite Funktionsaufrufe sein. Zum Beispiel beginnen Ereignislistener, Timeout-Jobs und Promise-Handler alle ihre eigene Aufrufkette. Quellcode innerhalb von eval()
- und Function
-Konstruktoraufrufen erscheint ebenfalls im Stapel:
console.log(new Function("return new Error('Function failed')")().stack);
console.log("====");
console.log(eval("new Error('eval failed')").stack);
#### JavaScriptCore anonymous@ global code@filename.js:1:65 ==== eval code@ eval@[native code] global code@filename.js:3:17 #### SpiderMonkey anonymous@filename.js line 1 > Function:1:8 @filename.js:1:65 ==== @filename.js line 3 > eval:1:1 @filename.js:3:13 #### V8 Error: Function failed at eval (eval at <anonymous> (filename.js:1:13), <anonymous>:1:8) at filename.js:1:65 ==== Error: eval failed at eval (eval at <anonymous> (filename.js:3:13), <anonymous>:1:1) at filename.js:3:13
In Firefox können Sie die //# sourceURL
-Direktive nutzen, um eine Evalquelle zu benennen. Siehe die Firefox Debug eval sources-Dokumente und den Blogpost Naming eval
Scripts with the //# sourceURL
Directive für weitere Details.
Beispiele
Verwenden der stack-Eigenschaft
Das folgende Skript demonstriert, wie Sie die stack
-Eigenschaft verwenden, um einen Stapeltrace in Ihrem Browserfenster auszugeben. Sie können dies verwenden, um zu überprüfen, wie die Stapelstruktur Ihres Browsers aussieht.
function trace() {
throw new Error("trace() failed");
}
function b() {
trace();
}
function a() {
b(3, 4, "\n\n", undefined, {});
}
try {
a("first call, first arg");
} catch (e) {
document.getElementById("output").textContent = e.stack;
}
Spezifikationen
Teil keiner Norm.
Browser-Kompatibilität
BCD tables only load in the browser
Siehe auch
- TraceKit auf GitHub
- stacktrace.js auf GitHub
- Stack trace API in den V8-Dokumenten