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

时间:2011-05-16 07:24:22

标签: c++ lua luabind

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

  1. 我发现的例子告诉我使用luabind::from_stack(e.state(), -1)。这不会将错误消息留在堆栈中吗?我不应该弹出它吗?

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

  3. 如何在发生错误后确保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());
    }
    

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分: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