[英]How do I make sure that the (luabind) lua state is good after an error has occurred?
當lua代碼導致異常時,luabind將在堆棧上留下一條錯誤消息供我收集。 我想知道如何在處理異常后確保lua堆棧處於明智狀態:
我發現的示例告訴我使用luabind::from_stack(e.state(), -1)
。 這不會將錯誤消息保留在堆棧中嗎? 我不應該彈出它嗎?
從堆棧彈出錯誤消息是否足夠? 該錯誤是否會導致其他垃圾遺留在堆棧上?
發生錯誤后,如何確保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());
}
它將錯誤消息留在堆棧上。 是否彈出它完全取決於接下來要處理的堆棧。 如果您不再需要該消息(因為您已將其保存在其他位置),則將其彈出。 如果要在鎖扣鏈的更下方使用它,則將其留下。 關鍵是,您使用Lua堆棧與Lua API進行通信,它所具有的功能完全取決於您要告訴API的內容。
這里有兩種解釋“垃圾”的方法:
如“ 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.