2011-05-16 68 views
2

当lua代码导致异常时,luabind会在堆栈中留下一条错误消息供我收集。我想知道如何保证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
  1. 会留下错误消息在堆栈中。你是否应该弹出它,完全取决于你在接下来的堆栈中做什么。如果你不再需要该消息(因为你将它保存在其他地方),然后弹出它。如果你打算把它用在渔链上,那么就把它放下。关键是,您使用Lua堆栈与Lua API进行通信,您拥有的内容完全取决于您想要告诉API的内容。

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

    • 正如在“Lua中栈已危及内部结构和功能lua_XXX任何通话将段错误/崩溃的/ etc”。不管发生什么样的C++异常,这都不会发生,所以Luabind有责任防范这种情况。任何C++异常都是由Luabind引发和处理的,因为Lua本身是用C语言编写的,在它的世界中没有例外。

    • 正如“堆栈中有一些值不再需要”一样。堆栈上不应该有垃圾。如果你觉得偏执,随时清除栈lua_settop(0) Lua的API的任何调用链

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