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”的異常。
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 $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()方法,該方法會立即丟擲異常。

js
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 的瀏覽器中載入。

另請參閱