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

How do I make sure that the (luabind) lua state is good after an error has occurred?

本文关键字:lua luabind 状态 何确保 确保 错误      更新时间:2023-10-16

当lua代码导致异常时,luabind会在堆栈上留下一条错误消息供我收集。我想知道如何保证在处理异常后 lua 堆栈处于合理的状态:

  1. 我找到的例子告诉我使用luabind::from_stack(e.state(), -1) .这不会让错误消息仍在堆栈上吗?我不应该弹出它吗?

  2. 从堆栈中弹出错误消息是否足够?该错误是否会导致其他垃圾留在堆栈上?

如何确保发生错误后 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());
}
  1. 它将在堆栈上留下错误消息。是否应该弹出它完全取决于您接下来对堆栈做什么。如果您不再需要该消息(因为您已将其保存在其他地方),请弹出它。如果你打算在捕获链的下游使用它,那就离开它。关键是,你使用 Lua 堆栈与 Lua API 进行通信,你拥有的东西完全取决于你想告诉 API 什么。

  2. 这里有两种解释"垃圾"的方法:

    • 如"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