uberiain
unread,Aug 6, 2008, 6:19:49 AM8/6/08Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Sign in to report message
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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.