WebAssembly.Exception.prototype.getArg()

getArg()Exception 对象的原型方法,可用于获取异常数据参数中指定项的值。

该方法传递一个 WebAssembly.Tag,并且只有在抛出的 Exception 使用相同的标签创建时才会成功,否则将抛出 TypeError。这确保了只有在调用代码能够访问标签时才能读取异常。既未导入也未导出到 WebAssembly 代码中的标签是内部的,并且其关联的 WebAssembly.Exception 无法使用此方法查询!

注意:标签具有相同的数据类型序列是不够的——它必须与用于创建异常的标签具有相同的标识(是相同的标签)。

语法

js
getArg(exceptionTag, index)

参数

exceptionTag

必须与与此异常关联的标签匹配的 WebAssembly.Tag

index

要返回的数据参数中值的索引,从 0 开始。

返回值

index 处参数的值。

异常

TypeError

标签不匹配;异常不是使用传递给方法的标签创建的。

RangeError

index 参数的值大于或等于数据中的字段数。

示例

为了获取异常的值,调用代码必须“知道”该标签;它可以导入到或导出自调用代码。

从导入的标签获取异常值

考虑以下 WebAssembly 代码,假设它已编译为文件“example.wasm”。它导入了一个标签,在内部将其称为 $tagname,并导出一个方法 run,外部代码可以调用该方法以使用该标签抛出异常。

wasm
(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() 方法,该方法将立即抛出异常。

js
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 模块,只是将导入替换为导出。

wasm
(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() 方法 测试我们是否拥有正确的标签。

js
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 的浏览器中加载。

另请参阅