WebAssembly 模块可能会抛出异常以解锁事件循环,以便可以通过其他同步代码来处理事件。目前我能找到的唯一例子是在Rust 的 winit crate 中。请注意,
throw
的实现如下:
pub fn throw(msg: &str) {
wasm_bindgen::throw_str(msg);
}
我希望抛出这样的异常会释放 WebAssembly 堆栈。此外,即使堆栈没有展开,一旦处理了事件(如果有),堆栈如何回滚?
抛出 WASM 异常并不是“屈服”。它不会“倒回堆栈”。它更类似于
panic
- 它将终止当前执行,直到某些东西(通常是浏览器)捕获它。没有任何工具可以在代码抛出的位置恢复执行。
现在,浏览器可能会通过执行其他处理程序和事件来再次调用您的代码,但是您抛出的堆栈已经消失了 - 类似于在使用
catch_unwind
捕获恐慌后恢复执行。