2011-06-20 10 views
5

Estoy usando lua 5.1 y estoy usando lua para cargar funciones que luego pueden invocarse desde C++.el mensaje de error de una función lua llamada con lua_pcall geting lost

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; 
     } 
    } 
} 

El problema es que si la función Lua que llamo desde C++ llama a otra función que los errores a cabo entonces el retorno es el primer argumento de esta función en lugar del mensaje de error.

AlwaysErrorsOut define como:

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

Lua Prueba 1:

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

de salida:

- test.lua: 1: Error de comprobación exitosa

Lua Prueba 2 :

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

de salida:

- Weirdness está sucediendo

Mi teoría actual es que después de que ocurre el error el mensaje de error se coloca en la parte superior de la pila y la pila se reduce entonces a 1.

¿Alguien sabe cómo evitar la pérdida del mensaje de error?

+1

¿Puede mostrar el código de 'AlwaysErrorsOut'? –

+0

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

Respuesta

1

El problema era con un poco de algo de mi código que había pasado por alto completamente, en él que tenía otro objeto LuaStackBalancer que fue creado y su destructor llamaron cuando fue arrojado el error que resulta en la pérdida del mensaje de error. ^^ U

Gracias a todos por su ayuda y por favor, perdona mi torpeza

+0

y aparentemente tengo que esperar 10 horas antes de que pueda configurar esto como la respuesta>.> – khm

0

Parece que funciona bien cuando se convierte completamente a Lua (consulte a continuación). Tal vez el problema es que el lua_pcall está configurado para valores sin retorno. Intente usar LUA_MULTRET en lugar de 0 en la llamada al 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 
+0

sí, dosifica, pero quiero poder llamar a las funciones de Lua desde C++ y obtener los mensajes de error – khm

+0

¿Funciona el uso de 'LUA_MULTRET' en lugar de' 0'? – gwell

+0

No, desafortunadamente no es – khm

Cuestiones relacionadas