繁体   English   中英

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

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

当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 / 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM