catch

catch 属性允许捕获 JavaScript 异常。它可以附加到任何导入的函数或方法,并且该函数必须返回一个 Result,其中 Err 负载为 JsValue


# #![allow(unused_variables)]
#fn main() {
#[wasm_bindgen]
extern "C" {
    // `catch` on a standalone function.
    #[wasm_bindgen(catch)]
    fn foo() -> Result<(), JsValue>;

    // `catch` on a method.
    type Zoidberg;
    #[wasm_bindgen(catch, method)]
    fn woop_woop_woop(this: &Zoidberg) -> Result<u32, JsValue>;
}
#}

如果调用导入的函数抛出异常,则将返回 Err,其中包含抛出的异常。否则,将返回 Ok,其中包含函数的结果。

默认情况下,当 wasm 调用最终抛出异常的 JS 函数时,wasm-bindgen 不会采取任何操作。当前的 wasm 规范不支持堆栈展开,因此 Rust 代码 **不会执行析构函数**。这可能会导致 Rust 中的内存泄漏,但一旦 wasm 实现捕获异常,我们一定会添加支持!