如何通过异常从同步代码中产生收益?

问题描述 投票:0回答:1

WebAssembly 模块可能会抛出异常以解锁事件循环,以便可以通过其他同步代码来处理事件。目前我能找到的唯一例子是在Rust 的 winit crate 中。请注意,

throw
的实现如下:

pub fn throw(msg: &str) {
    wasm_bindgen::throw_str(msg);
}

我希望抛出这样的异常会释放 WebAssembly 堆栈。此外,即使堆栈没有展开,一旦处理了事件(如果有),堆栈如何回滚?

exception asynchronous rust event-handling webassembly
1个回答
0
投票

抛出 WASM 异常并不是“屈服”。它不会“倒回堆栈”。它更类似于

panic
- 它将终止当前执行,直到某些东西(通常是浏览器)捕获它。没有任何工具可以在代码抛出的位置恢复执行。

现在,浏览器可能会通过执行其他处理程序和事件来再次调用您的代码,但是您抛出的堆栈已经消失了 - 类似于在使用

catch_unwind
捕获恐慌后恢复执行。

© www.soinside.com 2019 - 2024. All rights reserved.