2011-05-16 69 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