发生错误后,如何确保(luabind)lua状态良好?

| 当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 / crash / etc \”。无论您抛出什么C ++异常,这都永远不会发生,这是Luabind的责任,谨防这种情况。 Luabind会抛出和处理任何C ++异常,因为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
    

要回复问题请先登录注册