exnref: Wasm-Wertetyp
Der exnref-Wertetyp repräsentiert eine geworfene Ausnahme in einem Wasm-Modul, sodass sie erneut geworfen werden kann.
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 repräsentiert eine geworfene Ausnahme in einem Wasm-Modul. Dieser Werttyp wird von den catch_ref und catch_all_ref Klauseln zurückgegeben, wodurch eine Referenz auf die gerade geworfene Ausnahme bereitgestellt wird. Diese kann bei Bedarf mit dem Befehl throw_ref erneut geworfen werden.
Die WebAssembly.Exception JavaScript-Schnittstelle repräsentiert eine Wasm-Ausnahme im JavaScript-Host.
Hinweis:
Sie können keine Wasm-Funktion von JavaScript aus aufrufen, die einen exnref-Wert als Parameter oder Ergebnis hat. Ein solcher Versuch führt zu einem Fehler.
Siehe auch
- Befehl
throw_ref - Befehl
try_table- Klausel
catch_ref - Klausel
catch_all_ref
- Klausel
- Definition
tag WebAssembly.ExceptionJavaScript-Schnittstelle