Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
Error.prototype.stack
Nicht standardisiert: Diese Funktion ist nicht standardisiert. Wir raten davon ab, nicht-standardisierte Funktionen auf produktiven Webseiten zu verwenden, da sie nur von bestimmten Browsern unterstützt werden und sich in Zukunft ändern oder entfernt werden können. Unter Umständen kann sie jedoch eine geeignete Option sein, wenn es keine standardisierte Alternative gibt.
Hinweis:Diestack-Eigenschaft wird de facto von allen großen JavaScript-Engines implementiert, unddas JavaScript-Standardkomitee erwägt, sie zu standardisieren. Aufgrund von Implementierungsinkonsistenzen können Sie sich nicht auf den genauen Inhalt des Stack-Strings verlassen, aber Sie können im Allgemeinen davon ausgehen, dass er existiert und zu Debugging-Zwecken verwendet werden kann.
Die nicht standardisiertestack-Eigenschaft einerError-Instanz bietet eine Rückverfolgung, welche Funktionen aufgerufen wurden, in welcher Reihenfolge, von welcher Zeile und Datei und mit welchen Argumenten. Der Stack-String geht von den neuesten Aufrufen zu den früheren zurück und führt zurück zum ursprünglichen Aufruf im globalen Bereich.
In diesem Artikel
Wert
Ein String.
Da diestack-Eigenschaft nicht standardisiert ist, unterscheiden sich die Implementierungen darin, wo sie installiert ist.
- 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 vonError.prototype.stack | |
|---|---|
| Schreibbar | ja |
| Aufzählbar | nein |
| Konfigurierbar | ja |
Beschreibung
Jede JavaScript-Engine verwendet ihr eigenes Format für Stack-Traces, aber sie sind in ihrer Gesamtstruktur ziemlich konsistent. Jede Implementierung verwendet eine separate Zeile im Stack, um jeden Funktionsaufruf darzustellen. Der Aufruf, der direkt den Fehler verursacht hat, steht ganz oben, und der Aufruf, der die gesamte Aufrufkette gestartet hat, steht ganz unten. Nachfolgend einige Beispiele für Stack-Traces:
function foo() { bar();}function bar() { baz();}function baz() { console.log(new Error().stack);}foo();#### JavaScriptCorebaz@filename.js:10:24bar@filename.js:6:6foo@filename.js:2:6global code@filename.js:13:4#### SpiderMonkeybaz@filename.js:10:15bar@filename.js:6:3foo@filename.js:2:3@filename.js:13:1#### V8Error at baz (filename.js:10:15) at bar (filename.js:6:3) at foo (filename.js:2:3) at filename.js:13:1
V8 bietet die nicht standardisiertestack trace API zur Anpassung der Stack-Trace, einschließlichError.captureStackTrace(),Error.stackTraceLimit, undError.prepareStackTrace(). Andere Engines unterstützen diese API in unterschiedlichem Ausmaß.
Verschiedene Engines setzen diesen Wert zu unterschiedlichen Zeiten. Die meisten modernen Engines setzen ihn, wenn dasError-Objekt erstellt wird. Dies bedeutet, dass Sie die vollständige Aufrufstack-Information innerhalb einer Funktion erhalten können, indem Sie Folgendes verwenden:
function foo() { console.log(new Error().stack);}Ohne einen Fehler werfen und dann abfangen zu müssen.
Stack-Frames können auch andere Dinge außer expliziten Funktionsaufrufen sein. Beispielsweise beginnen Event-Listener, Timeout-Jobs und Promise-Handler alle ihre eigene Aufrufkette. Quellcode innerhalb voneval() undFunction-Konstruktoraufrufen erscheint ebenfalls im Stack:
console.log(new Function("return new Error('Function failed')")().stack);console.log("====");console.log(eval("new Error('eval failed')").stack);#### JavaScriptCoreanonymous@global code@filename.js:1:65====eval code@eval@[native code]global code@filename.js:3:17#### SpiderMonkeyanonymous@filename.js line 1 > Function:1:8@filename.js:1:65====@filename.js line 3 > eval:1:1@filename.js:3:13#### V8Error: 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 verwenden, um eine eval-Quelle zu benennen. Siehe die FirefoxDebug eval sources Dokumentation.
Beispiele
>Verwendung der stack-Eigenschaft
Das folgende Skript zeigt, wie Sie diestack-Eigenschaft verwenden können, um einen Stack-Trace in Ihrem Browserfenster auszugeben. Sie können dies verwenden, um die Struktur des Stacks Ihres Browsers zu überprüfen.
<div></div>#output { white-space: pre; font-family: monospace;}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
Nicht Teil eines Standards.
Browser-Kompatibilität
Siehe auch
- TraceKit auf GitHub
- stacktrace.js auf GitHub
- Stack trace API in den V8-Dokumentationen