Get to know MDN better
此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。
备注: 此特性在 Web Worker 中可用。
WebAssembly.Exception 对象表示一个从 WebAssembly 向 JavaScript 抛出、或者从 JavaScript 向 WebAssembly 的异常处理器抛出的运行时异常。
构造函数接受一个 WebAssembly.Tag、一个由值组成的数组和一个 options 对象作为参数。标签唯一地定义了异常的类型,包括异常的参数的顺序和参数的数据类型。访问抛出的异常的参数所用的标签要求和用于创建 Exception 的标签相同。提供了用于测试异常是否和特定的标签匹配的方法,也提供了通过索引获取特定值的方法(如果异常匹配上指定的标签的话)。
当关联的标签共享时,JavaScript 和其他客户端代码仅能访问 WebAssembly 异常值,反之亦然(你不能仅使用恰好定义了相同数据类型的其他标签)。没有匹配的标签,也可以捕获以及重新抛出异常,但是不能对其进行检查。
为了让异常抛出更快,从 WebAssembly 抛出的异常通常不包括堆栈跟踪。需要提供堆栈跟踪的 WebAssembly 代码必须在调用创建异常的 Javascript 函数时,在构造函数中传递 options.traceStack=true 参数。然后构造函数可能会返回一个将堆栈跟踪附着到 stack 属性的异常。
创建一个新的 WebAssembly.Exception 对象。
测试异常是否匹配某个特定的标签。
Exception.prototype.getArg()返回与特定标签相匹配的异常的数据字段。
返回异常的堆栈跟踪,或者 undefined。
这个示例展示如何定义一个标签并将其导入到模块,然后用它抛出一个在 JavaScript 中被捕获的异常。
思考下面的 WebAssembly 代码,假设其被编译为 example.wasm 文件。
下面的代码调用 WebAssembly.instantiateStreaming 导入 example.wasm 文件,传入的“导入对象”(importObject)中包含一个新的、名为 tagToImport 的 WebAssembly.Tag。导入的对象用匹配 WebAssembly 代码中 import 语句的属性定义一个对象。
一旦实例化文件,代码就调用导出的 WebAssembly run 方法,该方法会立即抛出一个异常。
在 JavaScript 中使用 catch 块捕获异常。我们可以看见它是 WebAssembly.Exception 类型,但是如果我们没有正确的标签的话,我们就什么也做不了。
然而,因为我们有一个标签,于是使用 Exception.prototype.is() 检查它是否是正确的那个,又因为它是正确的,于是调用 Exception.prototype.getArg() 读取值“42”。
| WebAssembly JavaScript Interface: Exception Handling # runtime-exceptions |
启用 JavaScript 以查看此浏览器兼容性表。