我正在使用lua 5.1而我正在使用lua来加载可以从C ++调用的函数。
int Error = luaL_loadfile(LuaState, "Test.lua");
if(!Error)
{
Error = lua_pcall(LuaState, 0, LUA_MULTRET, 0);
}
if(Error)
{
std::cerr << "-- " << lua_tostring(LuaState, -1) << std::endl;
lua_pop(LuaState, 1);
}
else
{
LuaStackBalancer LSB(LuaState); //Puts the Lua Stack back to the way it was found
lua_pushstring(LuaState, "Run");
lua_gettable(LuaState, LUA_GLOBALSINDEX);
if(lua_isfunction(LuaState, -1))
{
if(lua_pcall(LuaState, 0, 0, 0))
{
std::cerr << "-- " << lua_tostring(LuaState, -1) << std::endl;
}
}
}
问题是,如果我从C ++调用的lua函数调用另一个错误输出的函数,则返回是该函数的第一个参数而不是错误消息。
AlwaysErrorsOut定义为:
int AlwaysErrorsOut(lua_State *LuaState)
{
return luaL_error(LuaState, "Error Test Successful");
}
Lua Test 1:
--Test.lua
AlwaysErrorsOut("Weirdness is happening")
输出:
- Test.lua:1:错误测试成功
Lua Test 2:
--Test.lua
function Run()
AlwaysErrorsOut("Weirdness is happening")
end
输出:
- 发生了奇怪的事情
我目前的理论是,在错误发生后,错误消息被放置在堆栈顶部,然后堆栈减少到1.
任何人都知道如何防止丢失错误消息?
答案 0 :(得分:1)
问题在于我完全忽略了我的一些代码,在其中我创建了另一个LuaStackBalancer对象,并在抛出错误时调用了析构函数,导致丢失了错误消息。 ^^û
谢谢大家的帮助,请原谅我的愚蠢
答案 1 :(得分:0)
当完全转换为Lua时似乎工作正常(见下文)。也许问题是lua_pcall
被设置为没有返回值。在致电LUA_MULTRET
时,请尝试使用0
代替Run
。
local x=loadstring[[
function AlwaysErrorsOut(s)
error("Test Successfull")
end
function Run()
AlwaysErrorsOut("Weirdness is happening")
end
]]
local a,b = pcall(x)
print(a) --> true
print(b) --> nil
local a,b = pcall(_G["Run"])
print(a) --> false
print(b) --> [string "function AlwaysErrorsOut(s)..."]:2: Test Successfull