簡體   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