WebAssembly.Exception
注意:此功能在Web Workers中可用。
WebAssembly.Exception
对象表示从 WebAssembly 抛出到 JavaScript 的运行时异常,或从 JavaScript 抛出到 WebAssembly 异常处理程序的异常。
该构造函数接受一个WebAssembly.Tag
、一个值数组和一个options
对象作为参数。该标签唯一地定义了异常的类型,包括其参数的顺序及其数据类型。创建Exception
时使用的相同标签需要访问抛出异常的参数。提供了一些方法来测试异常是否与特定标签匹配,以及通过索引获取特定值(如果异常与指定的标签匹配)。
只有当关联的标签共享时,JavaScript 和其他客户端代码才能访问 WebAssembly 异常值,反之亦然(您不能只使用另一个碰巧定义相同数据类型的标签)。如果没有匹配的标签,可以捕获异常并重新抛出,但无法检查它们。
为了使异常抛出更快,从 WebAssembly 抛出的异常通常不包含堆栈跟踪。需要提供堆栈跟踪的 WebAssembly 代码必须调用 JavaScript 函数来创建异常,并在构造函数中传递options.traceStack=true
参数。然后,构造函数可能会返回一个异常,该异常将堆栈跟踪附加到stack
属性。
构造函数
WebAssembly.Exception()
-
创建一个新的
WebAssembly.Exception
对象。
实例方法
Exception.prototype.is()
-
测试异常是否与特定标签匹配。
Exception.prototype.getArg()
-
返回与指定标签匹配的异常的数据字段。
实例属性
Exception.prototype.stack
非标准-
返回异常的堆栈跟踪,或
undefined
。
示例
此示例显示了如何定义一个标签并将其导入模块,然后使用它来抛出一个在 JavaScript 中捕获的异常。
考虑以下 WebAssembly 代码,假设它已编译到文件example.wasm中。
- 该模块导入一个在内部称为
$tagname
的标签,该标签具有一个i32
参数。该标签期望使用模块extmod
和标签exttag
传递标签。 $throwException
函数使用throw
指令抛出异常,并采用$tagname
和参数参数。- 该模块导出函数
run()
,该函数抛出一个值为“42”的异常。
(module
;; import tag that will be referred to here as $tagname
(import "extmod" "exttag" (tag $tagname (param i32)))
;; $throwException function throws i32 param as a $tagname exception
(func $throwException (param $errorValueArg i32)
local.get $errorValueArg
throw $tagname
)
;; Exported function "run" that calls $throwException
(func (export "run")
i32.const 42
call $throwException
)
)
以下代码调用WebAssembly.instantiateStreaming
来导入example.wasm文件,并传入一个“导入对象”(importObject
),其中包含一个名为tagToImport
的新WebAssembly.Tag
。导入对象定义了一个对象,其属性与 WebAssembly 代码中的import
语句匹配。
文件实例化后,代码调用导出的 WebAssembly run()
方法,该方法会立即抛出异常。
const tagToImport = new WebAssembly.Tag({ parameters: ["i32"] });
// Note: import object properties match the WebAssembly import statement!
const importObject = {
extmod: {
exttag: tagToImport,
},
};
WebAssembly.instantiateStreaming(fetch("example.wasm"), importObject)
.then((obj) => {
console.log(obj.instance.exports.run());
})
.catch((e) => {
console.error(e);
// Check we have the right tag for the exception
// If so, use getArg() to inspect it
if (e.is(tagToImport)) {
console.log(`getArg 0 : ${e.getArg(tagToImport, 0)}`);
}
});
/* Log output
example.js:40 WebAssembly.Exception: wasm exception
example.js:41 getArg 0 : 42
*/
异常在 JavaScript 中使用catch
块捕获。我们可以看到它属于WebAssembly.Exception
类型,但如果我们没有正确的标签,我们就无法做更多的事情。
但是,因为我们有一个标签,所以我们使用Exception.prototype.is()
来检查它是否是正确的标签,并且因为它是正确的,所以我们调用Exception.prototype.getArg()
来读取“42”的值。
规范
规范 |
---|
WebAssembly JavaScript 接口:异常处理 # 运行时异常 |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。