exnref: Wasm-Werttyp
Der exnref Werttyp repräsentiert eine ausgelöste Ausnahme in einem Wasm-Modul und ermöglicht es, diese erneut auszulösen.
Probieren Sie es aus
(module
;; Import error tag
(tag $my_error (import "env" "my_error") (param i32))
(func $try_and_rethrow (param $value i32)
;; Define a variable to store an exnref
(local $err exnref)
(block $handler (result i32 exnref)
(try_table (catch_ref $my_error $handler)
(call $might_throw (local.get $value))
)
(return)
)
;; catch_ref returns error value and exnref
;; Stack is now: i32, exnref (exnref on top)
(local.set $err) ;; pop exnref
(drop) ;; drop the i32 payload
(local.get $err) ;; push exnref back
(throw_ref)
)
;; Function that throws an error of type $my_error
;; when its parameter is less than 0
(func $might_throw (param $value i32)
(local.get $value)
(i32.const 0)
(i32.lt_s)
(if
(then
(i32.const 42)
(throw $my_error)
)
)
)
(export "try_and_rethrow" (func $try_and_rethrow))
)
// Define error tag in JS
const myErrorTag = new WebAssembly.Tag({ parameters: ["i32"] });
// Import the tag into the module
const env = {
my_error: myErrorTag,
};
WebAssembly.instantiateStreaming(fetch("{%wasm-url%}"), { env }).then(
(result) => {
try {
// Negative value causes function to throw
result.instance.exports.try_and_rethrow(-1);
} catch (e) {
if (e instanceof WebAssembly.Exception && e.is(myErrorTag)) {
// 0 is the first payload value, which is equal to 42
const errorCode = e.getArg(myErrorTag, 0);
console.log("Error code:", errorCode);
} else {
// Throw other errors
throw e;
}
}
},
);
Syntax
wat
;; Define variable to hold exnref
(local $err exnref)
Beschreibung
Der exnref Typ stellt eine ausgelöste Ausnahme in einem Wasm-Modul dar. Dieser Werttyp wird von den Klauseln catch_ref und catch_all_ref zurückgegeben und bietet eine Referenz auf die soeben ausgelöste Ausnahme. Dies ermöglicht es, die Ausnahme bei Bedarf mit der Anweisung throw_ref erneut auszulösen.
Die JavaScript-Schnittstelle WebAssembly.Exception stellt eine Wasm-Ausnahme im JavaScript-Host dar.
Hinweis:
Sie können keine Wasm-Funktion aus JavaScript aufrufen, die einen exnref Wert als Parameter oder Ergebnis hat. Der Versuch, dies zu tun, führt zu einem Fehler.
Spezifikationen
| Spezifikation |
|---|
| WebAssembly Core Specification> # reference-types%E2%91%A0> |
Browser-Kompatibilität
Siehe auch
throw_refAnweisungtry_tableAnweisungcatch_refKlauselcatch_all_refKlausel
tagDefinitionWebAssembly.ExceptionJavaScript-Schnittstelle