【发布时间】:2011-06-04 16:37:27
【问题描述】:
我有一个可以从 Lua 调用的 C++ 函数。为了演示我的问题,这里举个例子:
int PushHello(lua_State *L){
string str("Hello");
lua_pushlstring(L, str.data(), str.length());
return 1;
}
注意:我知道我不必在那里使用字符串变量,但它是用来演示问题的。
这是我的两个问题:
当我从 Lua 字符串构造函数调用此函数时,可能会抛出异常。那是问题吗? Lua 会处理它并正确展开 Lua 堆栈吗?我不这么认为。我该如何解决?我是否需要在所有此类代码周围添加
try/catch并将异常转换为 lua_error?没有更好的解决方案吗?另一个我可能通过将 Lua 编译为 C++ 解决的问题是,如果使用 longjmp,
lua_pushlstring()调用lua_error()字符串析构函数将不会被调用。问题是否通过编译为 C++ 并抛出异常而不是使用 longjmp 来解决?
为了澄清,我可以看到问题 1 的可能解决方案是:
int PushHello(lua_State *L){
string str;
try{
str.assign("Hello");
catch(exception &e){
luaL_error(L, e.what());
}
lua_pushlstring(L, str.data(), str.length());
return 1;
}
但这非常丑陋且容易出错,因为try/catch 需要添加到许多地方。它可以作为一个宏来完成,并放置所有可以抛出的命令,但这不会更好。
【问题讨论】:
-
@Blaho 我认为这个堆栈交换proposal 可能会引起您的兴趣。如果它是显示您的支持并帮助它进入测试版! :)