WebAssembly.Exception.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.

Die schreibgeschützte stack-Eigenschaft eines Objektinstanzen des Typs WebAssembly.Exception kann einen Stack-Trace enthalten.

Ausnahmen aus WebAssembly-Code enthalten standardmäßig keinen Stack-Trace.

Wenn WebAssembly-Code einen Stack-Trace bereitstellen muss, muss eine JavaScript-Funktion aufgerufen werden, um die Ausnahme zu erstellen, wobei der Parameter options.traceStack=true an den Konstruktor übergeben wird. Die virtuelle Maschine kann dann einen Stack-Trace an das vom Konstruktor zurückgegebene Ausnahmeobjekt anhängen.

Hinweis: Stack-Traces werden normalerweise nicht aus WebAssembly-Code übermittelt, um die Leistung zu verbessern. Die Möglichkeit, Stack-Traces zu diesen Ausnahmen hinzuzufügen, wird für Entwickler-Tools bereitgestellt und wird im Allgemeinen nicht für den breiteren Einsatz empfohlen.

Wert

Eine Zeichenkette, die den Stack-Trace enthält, oder undefined, wenn kein Trace zugewiesen wurde.

Die Stack-Trace-Zeichenkette listet die Positionen jeder Operation im Stack im WebAssembly-Format auf. Dies ist eine menschenlesbare Zeichenkette, die die URL, den Namen des aufgerufenen Funktionstyps, den Funktionsindex und dessen Offset im Modul-Binärformat angibt. Sie hat in etwa dieses Format (siehe Stack-Trace-Konventionen in der Spezifikation für weitere Informationen):

${url}:wasm-function[${funcIndex}]:${pcOffset}

Beispiele

Dieses Beispiel demonstriert, wie eine Ausnahme aus WebAssembly geworfen wird, die einen Stack-Trace enthält.

Betrachten Sie den folgenden WebAssembly-Code, von dem angenommen wird, dass er in eine Datei namens example.wasm kompiliert wird. Dies importiert ein Tag, das intern als $tagname bezeichnet wird, und importiert eine Funktion, die intern als $throwExnWithStack bezeichnet wird. Es exportiert die Methode run, die von externem Code aufgerufen werden kann, um $throwExnWithStack (und somit die JavaScript-Funktion) aufzurufen.

wasm
(module
  ;; import tag that will be referred to here as $tagname
  (import "extmod" "exttag" (tag $tagname (param i32)))

  ;; import function that will be referred to here as $throwExnWithStack
  (import "extmod" "throwExnWithStack" (func $throwExnWithStack (param i32)))

  ;; call $throwExnWithStack passing 42 as parameter
  (func (export "run")
    i32.const 42
    call $throwExnWithStack
  )
)

Der folgende JavaScript-Code definiert ein neues Tag tag und die Funktion throwExceptionWithStack. Diese werden beim Instanziieren dem WebAssembly-Modul im importObject übergeben.

Sobald die Datei instanziiert ist, ruft der Code die exportierte WebAssembly-Methode run() auf, die sofort eine Ausnahme auslöst. Der Stack wird dann aus der catch-Anweisung protokolliert.

js
const tag = new WebAssembly.Tag({ parameters: ["i32"] });

function throwExceptionWithStack(param) {
  // Note: We declare the exception with "{traceStack: true}"
  throw new WebAssembly.Exception(tag, [param], { traceStack: true });
}

// Note: importObject properties match the WebAssembly import statements.
const importObject = {
  extmod: {
    exttag: tag,
    throwExnWithStack: throwExceptionWithStack,
  },
};

WebAssembly.instantiateStreaming(fetch("example.wasm"), importObject)
  .then((obj) => {
    console.log(obj.instance.exports.run());
  })
  .catch((e) => {
    console.log(`stack: ${e.stack}`);
  });

//Log output (something like):
// stack: throwExceptionWithStack@http://<url>/main.js:76:9
// @http://<url>/example.wasm:wasm-function[3]:0x73
// @http://<url>/main.js:82:38

Der "relevanteste" Teil dieses Codes ist die Zeile, in der die Ausnahme erstellt wird:

js
new WebAssembly.Exception(tag, [param], { traceStack: true });

Die Übergabe von {traceStack: true} teilt der WebAssembly-Virtual-Maschine mit, dass sie einen Stack-Trace an die zurückgegebene WebAssembly.Exception anhängen soll. Ohne dies wäre der Stack undefined.

Browser-Kompatibilität

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
Stack trace
Non-standard

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support
No support
No support
Non-standard. Check cross-browser support before using.

Siehe auch