Tengo una función de C++ en funcionamiento a la que puedo llamar desde Lua. Para demostrar mi problema aquí es un ejemplo:¿Cómo manejar las excepciones de C++ al llamar a funciones desde Lua?
int PushHello(lua_State *L){
string str("Hello");
lua_pushlstring(L, str.data(), str.length());
return 1;
}
Nota: Yo sé que no tengo que usar variable de cadena allí, pero está ahí para demostrar el problema.
Aquí están mis dos problemas:
Cuando llamo a esta función desde Lua constructor de cadena puede producir una excepción. ¿Es eso un problema? ¿Lo manejará Lua y desenrollará correctamente la pila Lua? No lo creo. ¿Cómo puedo resolver eso? ¿Debo agregar
try/catch
a todo este código y convertir la excepción a lua_error? ¿No hay una mejor solución?Otro problema que probablemente he resuelto al compilar Lua como C++ es cuando
lua_pushlstring()
llama alua_error()
cadena destructor no se llamaría si se usara longjmp. ¿El problema se resuelve compilando como C++ y lanzando excepciones en lugar de usar longjmp?
Para aclarar, posible solución que puedo ver a un problema 1 sería la siguiente:
int PushHello(lua_State *L){
string str;
try{
str.assign("Hello");
catch(exception &e){
luaL_error(L, e.what());
}
lua_pushlstring(L, str.data(), str.length());
return 1;
}
Pero eso es muy feo y propenso a errores como try/catch
tendría que ser añadido a muchos lugares. Se podría hacer como una macro y poner cada comando que pueda arrojar, pero eso no sería mucho mejor.
@Blaho creo que esta pila de intercambio [propuesta] (http : //area51.stackexchange.com/proposals/11464/code-review? referrer = aWNm_PdciyFqjFW8CUacGw2 "revisión de código") puede ser de su interés. ¡Si es muestra tu apoyo y ayuda a ponerlo en beta! :) – greatwolf