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

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

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

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

我如何确保在出现错误后lua状态良好?

我得到了这个:

    // 进行可能导致lua出现异常的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());
}

原文链接 https://stackoverflow.com/questions/6014252

点赞
stackoverflow用户169828
stackoverflow用户169828
  1. 它会在堆栈上留下错误信息。是否需要弹出取决于您接下来在堆栈上要做什么。如果您不再需要这条消息(因为您已经将其保存在其他地方),那么弹出它。如果您将在捕获链的较低位置进一步使用它,则请将其保留。重点是,您使用 Lua 堆栈与 Lua API 进行通信,堆栈上的内容完全取决于您要告诉 API 的内容。

  2. 在这里有两种解释“垃圾”的方式:

  • 就像“Lua 堆栈已经破坏了内部结构,任何对lua_XXX函数的调用都会导致段错误/崩溃/等等”。无论您抛出什么 C++ 异常,都不应该发生这种情况,Luabind 负责防止这种情况发生。任何 C++ 异常都会被 Luabind 抛出并处理,因为 Lua 本身是用 C 编写的,在其世界中不存在异常这样的东西。

  • 就像“在堆栈上留下了一些我不再需要的值”。在堆栈上不应该留下垃圾。如果您感到偏执,请在任何一组 Lua API 调用之前使用 lua_settop(0) 来清除堆栈。

2011-05-17 17:50:53
stackoverflow用户1537432
stackoverflow用户1537432

最简单的方法可能是这样的

 int luaErr = luaL_dofile(luaState, "main.lua"); // 或其他 Lua 代码
 if (luaErr != 0)
      std::cout << "Lua 错误:" << lua_tostring(luaState, -1) << std::end
2012-08-04 15:32:31