сообщение об ошибке функции lua, вызываемой с lua_pcall, теряется - PullRequest
5 голосов
/ 21 июня 2011

Я использую 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;
        }
    }
}

Проблема в том, что если функция lua, которую я вызываю из C ++, вызывает другуюфункция, которая выдает ошибку, тогда возвращение является первым аргументом этой функции вместо сообщения об ошибке.

AlwaysErrorsOut определяется как:

int AlwaysErrorsOut(lua_State *LuaState) 
{ 
    return luaL_error(LuaState, "Error Test Successful"); 
}

Lua Test 1:

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

Out:

- Test.lua: 1: успешное тестирование на ошибку

Lua Test 2:

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

Out:

-Происходит странность

Моя текущая теория заключается в том, что после возникновения ошибки сообщение об ошибке помещается поверх стека, а затем размер стека уменьшается до 1.

Кто-нибудь знает, как предотвратить потерюсообщения об ошибке?

Ответы [ 2 ]

1 голос
/ 22 июня 2011

Проблема заключалась в том, что часть моего кода, которую я полностью упустил из виду, содержал еще один объект LuaStackBalancer, который был создан, и его деструктор вызывался при возникновении ошибки, что приводило к потере сообщения об ошибке.^^ u

Спасибо всем за помощь и, пожалуйста, прости мою глупость

0 голосов
/ 21 июня 2011

Кажется, работает нормально, когда полностью преобразован в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...