Tratamiento de errores usando luabind

4 views
Skip to first unread message

uberiain

unread,
Aug 6, 2008, 6:19:49 AM8/6/08
to lua-es
Hola a todos, estoy intentando saber el comportamiento del tratamiento
de errores usando Lua desde C++ por medio de luabind. Parece que
funciona correctamente pero en el tema del tratamiento de errores me
tiene un poco confuso, para ello os adjunto la parte de tratamiento a
la cual me refiero:

int main(int argc, char *argv[]) {

lua_State *Lua = lua_open();
luaL_openlibs(Lua);

open(Lua);// Conectar Luabind a este estado

RegisterToLuaTestA(Lua); // Registrar la clase en Lua
set_pcall_callback(&add_file_and_line); // Registrar tratamiento de
errores.
try {

RunLuaDoFile(Lua,"./scripts/Init.lua");
RunLuaDoFile(Lua,"./scripts/Test.lua");

TestA* elTest;
elTest = call_function<TestA*>(Lua, "Test")[adopt(result)];

for (int i = 0; i < 5; i++) {
elTest->Funcion(); // Un tipo de mensaje de error.
elTest->GetFuncionTabla()["Funcion"](elTest); // Otro tipo de
mensaje.
SLEEP(800);
}
delete elTest;
lua_close(Lua);
}
catch (error& e) {
object error_msg(from_stack(e.state(),-1));
std::cout << error_msg << " " << e.what() << std::endl;
}
catch (cast_failed& e){
object error_msg(from_stack(e.state(),-1));
std::cout << error_msg << " " << e.what() << std::endl;
}
catch (std::exception& e){
std::cout << "Throw error: " << e.what() << std::endl;
}
return 0;
}

asi mismo os adjunto el script donde defino la clase en Lua:

class "Test" (TestA)
function Test:__init()
super()
self:SetFuncionTabla(TestTabla)
print("[Test] init is called from ".._VERSION)

end
function Test:__finalize()
print("[Test] finalize is called from ".._VERSION)
end
function Test:Funcion()
print("Estoy en la funcion de lua.")
self:LocalFuncion()
io.flush()
end
--function Test:LocalFuncion()
-- print("Estoy en la funcion local de Lua")
--end
---------------------------------------------------------------
-- Con una Tabla ??.
---------------------------------------------------------------
TestTabla={}
TestTabla["Funcion"]=function(Test)
print("Estoy en la funcion de TestTabla")
Test:LocalFuncion()
end

Como veis el metodo LocalFuncion esta comentado y es el que da el
error (forzado). Y son dos caos,
si utilizo la llamada a Funcion directamente el resultado del mensaje
de error es el siguiente:

elTest->Funcion()

el resultado del error es:
./scripts/Test.lua:13 ./scripts/Test.lua:13: attempt to call method
'LocalFuncion' (a nil value) lua runtime error
Lo cual me identifica el mencionado error perfectamente. Pero si la
llamada es:

elTest->GetFuncionTabla()["Funcion"](elTest);

el mensaje obtenido es el siguiente:

Funcion lua runtime error

que tambien es correcto pero menos claro que el anterior. Sin embargo
la rutina de tratamiento de error definida en:
set_pcall_callback(&add_file_and_line);

genera este error en el mensaje:

./scripts/Test.lua:25 ./scripts/Test.lua:25: attempt to call method
'LocalFuncion' (a nil value)

que es el que creo correcto a mostrar. Supongo que es por un tema de
tratamiento de luabind en la recursion de llamadas.

Siento la extension del mensaje pero no he sabido como expresarme en
menos espacio. Si alguno me puede ayudar a entender este tratamiento
del error le estaria muy agradecido.

Un saludo.
Reply all
Reply to author
Forward
0 new messages