如何确保发生错误后(luabind)lua 状态良好
How do I make sure that the (luabind) lua state is good after an error has occurred?
当lua代码导致异常时,luabind会在堆栈上留下一条错误消息供我收集。我想知道如何保证在处理异常后 lua 堆栈处于合理的状态:
-
我找到的例子告诉我使用
luabind::from_stack(e.state(), -1)
.这不会让错误消息仍在堆栈上吗?我不应该弹出它吗? -
从堆栈中弹出错误消息是否足够?该错误是否会导致其他垃圾留在堆栈上?
如何确保发生错误后 lua 状态良好?
这就是我得到的:
try {
// Do lua-stuff here that causes an exception from lua
}
catch (const luabind::error& e) {
luabind::object error_msg(luabind::from_stack(e.state(), -1));
std::stringstream ss;
ss << error_msg;
throw my_own_exception_class(ss.str());
}
-
它将在堆栈上留下错误消息。是否应该弹出它完全取决于您接下来对堆栈做什么。如果您不再需要该消息(因为您已将其保存在其他地方),请弹出它。如果你打算在捕获链的下游使用它,那就离开它。关键是,你使用 Lua 堆栈与 Lua API 进行通信,你拥有的东西完全取决于你想告诉 API 什么。
-
这里有两种解释"垃圾"的方法:
-
如"Lua堆栈已经破坏了内部结构,任何对
lua_XXX
函数的调用都会SEGFAULT/崩溃/等"。无论您抛出什么C++例外,这都不应该发生,Luabind 有责任防止这种情况。任何C++异常都由Luabind抛出和处理,因为Lua本身是用C编写的,在它的世界里没有异常这样的东西。 -
如"堆栈上有一些我不再需要的值"。堆上不应该有垃圾。如果您感到偏执,请在任何Lua API调用链之前随时使用
lua_settop(0)
清除堆栈
-
最简单的方法可能是这个
int luaErr = luaL_dofile(luaState, "main.lua"); // or other lua stuff
if (luaErr != 0)
std::cout << "Lua error: " << lua_tostring(luaState, -1) << std::end
相关文章:
- C++Lua用户数据扰乱了Mathfu浮点值
- 使用 LuaBridge 或 Lua 将对象传递给 Lua 函数C++
- 将 Lua 函数块转换为 C 字符串
- 我可以从 lua 5.0.2 加载用 c++ 编写的 lua 5.3.5 dll 吗?
- 将错误与lua&luabind链接 - mingw
- luabind获取c++对象的类元表,将obj作为参数推送到lua函数
- Lua/C++/luabind /与其他 lua 行为脚本交互中成员函数的执行延迟
- Lua+Luabind,"runtime error"后堆栈顶部没有错误信息
- 如何将C++函数绑定到lua,该函数使用luabind返回多个值
- luabind:不能调用基本的lua函数,如print,tostring。
- 如何使用LuaBind将std::map绑定到Lua
- luabind:如何通过引用将值从C++传递给lua函数
- 返回带luabind的lua类指针
- LuaBind:如何将类的特定实例绑定到Lua
- 当Lua被绑定到类中时,使用LuaBind在类中调用Lua函数
- 使用Luabind实例化lua类
- 为什么当我的lua代码抛出错误时,我无法捕获luabind::error异常?
- 通过Luabind向Lua公开STL队列
- Lua函数在使用Luabind比较存储的C++对象指针时崩溃
- 如何确保发生错误后(luabind)lua 状态良好