WebAssembly.Exception.prototype.getArg()
getArg()
是 Exception
对象的原型方法,可用于获取异常数据参数中指定项的值。
该方法传递一个 WebAssembly.Tag
,并且只有在抛出的 Exception
使用相同的标签创建时才会成功,否则将抛出 TypeError
。这确保了只有在调用代码能够访问标签时才能读取异常。既未导入也未导出到 WebAssembly 代码中的标签是内部的,并且其关联的 WebAssembly.Exception
无法使用此方法查询!
注意:标签具有相同的数据类型序列是不够的——它必须与用于创建异常的标签具有相同的标识(是相同的标签)。
语法
getArg(exceptionTag, index)
参数
exceptionTag
-
必须与与此异常关联的标签匹配的
WebAssembly.Tag
。 index
-
要返回的数据参数中值的索引,从 0 开始。
返回值
index
处参数的值。
异常
TypeError
-
标签不匹配;异常不是使用传递给方法的标签创建的。
RangeError
-
index
参数的值大于或等于数据中的字段数。
示例
为了获取异常的值,调用代码必须“知道”该标签;它可以导入到或导出自调用代码。
从导入的标签获取异常值
考虑以下 WebAssembly 代码,假设它已编译为文件“example.wasm”。它导入了一个标签,在内部将其称为 $tagname
,并导出一个方法 run
,外部代码可以调用该方法以使用该标签抛出异常。
(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 i32)
local.get 0
throw $tagname
)
;; Exported function "run" that calls $throwException
(func (export "run")
i32.const 1
call $throwException
)
)
以下代码调用 WebAssembly.instantiateStreaming
以导入“example.wasm”文件,并传入一个“导入对象”(importObject
),其中包括一个名为 tagToImport
的新 WebAssembly.Tag
。导入对象定义了一个对象,其属性与 WebAssembly 代码中的 import
语句匹配。
文件实例化后,代码将调用导出的 WebAssembly run()
方法,该方法将立即抛出异常。
const tagToImport = new WebAssembly.Tag({ parameters: ["i32"] });
// Note: the import object properties match the import statement in WebAssembly code!
const importObject = {
extmod: {
exttag: tagToImport,
},
};
WebAssembly.instantiateStreaming(fetch("example.wasm"), importObject)
.then((obj) => {
console.log(obj.instance.exports.run());
})
.catch((e) => {
console.error(e);
console.log(`getArg 0 : ${e.getArg(tagToImport, 0)}`);
});
/* Log output
example.js:40 WebAssembly.Exception: wasm exception
example.js:41 getArg 0 : 1
*/
代码捕获异常并使用 getArg()
打印第一个索引处的值。在这种情况下,它只是“1”。
从导出的标签获取异常值
使用导出标签的过程与上一节中所示的过程非常相似。以下是相同的 WebAssembly 模块,只是将导入替换为导出。
(module
;; Export tag giving it external name: "exptag"
(tag $tagname (export "exptag") (param i32))
(func $throwException (param i32)
local.get 0
throw $tagname
)
(func (export "run")
i32.const 1
call $throwException
)
)
JavaScript 也类似。在这种情况下,我们没有导入,而是获取导出的标签并使用它来获取参数。为了使其更“安全”,这里我们还使用 is()
方法 测试我们是否拥有正确的标签。
let tagExportedFromWasm;
WebAssembly.instantiateStreaming(fetch("example.wasm"))
.then((obj) => {
// Import the tag using its name from the WebAssembly module
tagExportedFromWasm = obj.instance.exports.exptag;
console.log(obj.instance.exports.run());
})
.catch((e) => {
console.error(e);
// If the tag is correct, get the value
if (e.is(tagExportedFromWasm)) {
console.log(`getArg 0 : ${e.getArg(tagExportedFromWasm, 0)}`);
}
});
规范
规范 |
---|
WebAssembly JavaScript 接口:异常处理 # dom-exception-getarg |
浏览器兼容性
BCD 表格仅在启用了 JavaScript 的浏览器中加载。