当 duktape 抛出错误时,有什么方法可以让正确的 C++ 堆栈展开?

Any way to get proper C++ stack unwinding when duktape throws an error?

当 duktape 遇到错误时,目前是否有任何方法可以使 duktape 正确展开 C++ 堆栈(调用所有适当的析构函数等)?

我知道 Lua(例如)有能力通过在 Lua 由 C++ 编译器编译时从使用 longjmp 切换到 C++ 异常来执行此操作,但乍一看我在 duktape 中没有看到任何类似的东西,而且我肯定会以 C++ 析构函数未被调用而告终。如果 duktape 中尚不具备该功能,是否有相关计划? (如果以严格的后进先出方式设置和使用 longjmp 目的地,我猜它是可行的。如果不是,那么可能不太可行...)

我一直在玩 duktape,到目前为止给我留下了深刻的印象...我主要完成了一个基于 C++ 模板的元编程库,它可以让你自动创建 duktape 绑定到 C++ 函数。这个堆栈展开的东西可能是一个完整的交易破坏者,但是......如果我不相信我的 C++ 析构函数被调用,那么不要认为我可以使用 duktape。

编辑:实际上,经过进一步思考,我可能可以在不展开堆栈的情况下使事情正常进行,尽管当然一切都会更加复杂和容易出错。它仍然是一个很棒的功能。

很遗憾,您没有提供任何代码示例,所以我猜测您没有在 duk_create_heap and you are currently using the un-protected code execution variants like duk_eval. You should try using the protected code execution function variants like duk_peval 中设置致命错误处理程序。

从 Duktape 1.2 开始,尚不支持用 C++ 异常友好的 try-catch 机制替换 setjmp/longjmp(用于 Duktape 内部的错误处理)。不过计划在未来的版本中支持该功能。

作为快速更新:Duktape 1.4.0 支持使用 C++ 异常进行长控制传输 (https://github.com/svaarala/duktape/tree/master/examples/cpp-exceptions):

  • 定义 DUK_OPT_CPP_EXCEPTIONSDUK_USE_CPP_EXCEPTIONS 如果您直接编辑 duk_config.h)并使用 C++ 编译器编译。
  • 自动析构函数将在 Duktape/C 函数展开时工作。
  • 但是你不能抛出 C++ 异常 "through" Duktape。如果这样做,Duktape 会将 C++ 异常转换为 Ecmascript 异常。因此,虽然 Duktape/C 函数可以在内部使用 C++ 异常,但应该在它们传播到 Duktape 之前捕获这些异常。