2

当 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());
}
4

2 回答 2

1
  1. 它将在堆栈上留下错误消息。你是否应该弹出它完全取决于你接下来对堆栈做什么。如果您不再需要该消息(因为您已将其保存在其他地方),请弹出它。如果您打算在捕获链的下游进一步使用它,请留下它。关键是,你使用 Lua 堆栈与 Lua API 进行通信,你在它上面拥有什么完全取决于你想告诉 API 什么。

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

    • 如“Lua 堆栈已破坏内部结构,任何对lua_XXX函数的调用都会 SEGFAULT/crash/etc”。无论您抛出什么 C++ 异常,这都不应该发生,Luabind 有责任防止这种情况发生。任何 C++ 异常都由 Luabind 抛出和处理,因为 Lua 本身是用 C 编写的,在它的世界中没有异常之类的东西。

    • 如“堆栈上有一些我不再需要的值”。堆栈上不应该有垃圾。如果您感到偏执,请lua_settop(0)在任何 Lua API 调用链之前随时清除堆栈

于 2011-05-17T17:50:53.233 回答
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
于 2012-08-04T15:32:31.607 回答