调用 lua_pcall 函数时出现的错误信息丢失。

我正在使用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测试1:

--Test.lua
AlwaysErrorsOut("Weirdness is happening")

输出:

-- Test.lua:1: Error Test Successful

Lua测试2:

--Test.lua
function Run()
    AlwaysErrorsOut("Weirdness is happening")
end

输出:

-- Weirdness is happening

我目前的理论是,错误发生后,错误消息被放在堆栈顶部,然后堆栈被减少为1。

有人知道如何防止错误消息的丢失吗?

原文链接 https://stackoverflow.com/questions/6417890

点赞
stackoverflow用户173806
stackoverflow用户173806

似乎当完全转换为Lua时运作得很好(请参见下文)。也许问题是lua_pcall设置为没有返回值。尝试在对Run的调用中使用LUA_MULTRET而不是0

local x=loadstring[[
function AlwaysErrorsOut(s)
    error("测试成功")
end

function Run()
    AlwaysErrorsOut("出现奇怪情况")
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: 测试成功
2011-06-20 22:56:11
stackoverflow用户807445
stackoverflow用户807445

问题出在我代码中完全疏忽的某一部分。在其中,我创建了另一个 LuaStackBalancer 对象,当错误抛出时调用其析构函数,导致错误消息丢失。^^u

非常感谢大家的帮助,请原谅我的愚昧。

2011-06-22 10:47:49