【问题标题】:How do I make sure that the (luabind) lua state is good after an error has occurred?发生错误后,如何确保(luabind)lua 状态良好?
【发布时间】:2012-08-04 23:32:31
【问题描述】:

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

【问题讨论】:

    标签: c++ lua luabind


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

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

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

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

    【讨论】:

      【解决方案2】:

      最简单的方法大概就是这样

       int luaErr = luaL_dofile(luaState, "main.lua"); // or other lua stuff
       if (luaErr != 0)
            std::cout << "Lua error: " << lua_tostring(luaState, -1) << std::end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-16
        • 1970-01-01
        • 2012-07-20
        • 2012-06-01
        • 2022-01-05
        • 2012-10-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多