catch
catch
属性允许捕获 JavaScript 异常。它可以附加到任何导入的函数或方法,并且该函数必须返回一个 Result
,其中 Err
负载是 JsValue
#![allow(unused)] 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-bindgen
在 wasm 调用最终抛出异常的 JS 函数时不会采取任何操作。当前的 wasm 规范不支持堆栈展开,因此 Rust 代码 **不会执行析构函数**。不幸的是,这会导致 Rust 中的内存泄漏,但一旦 wasm 实现捕获异常,我们一定会添加支持!