【发布时间】:2015-02-07 16:36:50
【问题描述】:
我正在处理Rust wrapper for the Duktape JavaScript interpreter。在正常用例中,调用堆栈将如下所示:
- Rust:任意应用代码。
- Rust:我的库包装器。
- C:Duktape 解释器。
- Rust:我的 Rust 代码。
- Rust:应用程序代码中的任意回调。
如果 (5) 调用 panic! 会发生什么?根据 IRC 上的各种 Rust 开发人员的说法,尝试从像 (3) 这样的非 Rust 调用框架内部 panic! 可能会导致未定义的行为。
但根据 Rust 文档,捕获panic! 的唯一方法是使用std::task::try,它会产生一个额外的线程。还有rustrt::unwind::try,它不能在一个线程中嵌套两次,还有其他限制。
Benjamin Herr 提出的一种解决方案是,如果 (5) 中的代码出现恐慌,则中止该过程。我已经将他的解决方案打包为abort_on_panic,它似乎可以工作,对于“工作”的价值,包括“使整个程序崩溃,但至少不会巧妙地破坏事物”:
abort_on_panic!("cannot panic inside this block", {
panic!("something went wrong!");
});
但是有没有一种方法可以模拟 std::task::try 而无需创建线程/任务的开销?
【问题讨论】:
标签: multithreading error-handling rust ffi stack-unwinding