WebAssembly.Exception.prototype.stack
非标准:此功能是非标准的,并且不在标准跟踪中。请勿在面向 Web 的生产站点上使用它:它不会对每个用户都起作用。实现之间也可能存在较大的不兼容性,并且行为将来可能会发生变化。
类型为 WebAssembly.Exception
的对象实例的只读stack
属性可能包含堆栈跟踪。
来自 WebAssembly 代码的异常默认情况下不包含堆栈跟踪。
如果 WebAssembly 代码需要提供堆栈跟踪,则必须调用 JavaScript 函数来创建异常,并在 构造函数中传递options.traceStack=true
参数。然后,虚拟机可以将堆栈跟踪附加到构造函数返回的异常对象。
注意:通常不会从 WebAssembly 代码发送堆栈跟踪以提高性能。添加堆栈跟踪到这些异常的功能是为了开发人员工具,通常不建议广泛使用。
值
示例
此示例演示如何从包含堆栈跟踪的 WebAssembly 中抛出异常。
考虑以下 WebAssembly 代码,假设它已编译到名为example.wasm的文件中。它导入一个标签,在内部将其称为$tagname
,并导入一个它称为$throwExnWithStack
的函数。它导出方法run
,外部代码可以调用该方法来调用$throwExnWithStack
(以及 JavaScript 函数)。
(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
)
)
下面的 JavaScript 代码定义了一个新标签tag
和函数throwExceptionWithStack
。在实例化 WebAssembly 模块时,这些将作为importObject
传递给 WebAssembly 模块。
文件实例化后,代码调用导出的 WebAssembly run()
方法,该方法将立即抛出异常。然后从catch
语句记录堆栈。
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
此代码中最“相关”的部分是创建异常的行
new WebAssembly.Exception(tag, [param], { traceStack: true });
传入{traceStack: true}
告诉 WebAssembly 虚拟机它应该将堆栈跟踪附加到返回的WebAssembly.Exception
。如果没有此参数,堆栈将为undefined
。
浏览器兼容性
BCD 表仅在浏览器中加载