У меня есть программа на C ++, которую я связал с Lua, используя luabind.В настоящее время я тестирую методы обработки ошибок, которые могут предложить lua и luabind, чтобы помочь с отладкой сценариев lua в будущем.Цель состоит в том, чтобы luabind или lua выдавали исключение при возникновении синтаксических ошибок и ошибок программирования, чтобы я мог их отладить и исправить.
В настоящий момент проблема заключается в том, что приведенный ниже скрипт просто перестает выполняться без каких-либо сообщений об ошибках.или создаваемые исключения, поэтому в более крупной программе я бы понятия не имел, где будет проблема, или даже если вообще возникла проблема.
Вот соответствующие фрагменты:
Lua: (start.lua)
--complete file shown, this is meant to test the error handling of the C++ program
print("This is valid")
print(1234)
bad_function()
a = "meow"
b = 7
c = a + b
C ++:
Engine *callbackEngine;
int theCallback(lua_State *L) //This is so I can use my own function as an
//exception handler, pcall_log()
{
return callbackEngine->pcall_log(L);
}
void Engine::Run()
{
luabind::set_pcall_callback(&theCallback); //my own callback function,
//redirects to
//pcall_log() below
try {
luaL_dofile(L, "scripts/start.lua");
}
catch(luabind::error &sError) { //This never gets executed, noted by breakpoints
theCallback(L);
}
//etc...code not shown
int Engine::pcall_log(lua_State *L)
{
lua_Debug d;
lua_getstack( L,1,&d);
lua_getinfo( L, "Sln", &d);
lua_pop(L, 1);
stringstream ss;
ss.clear();
ss.str("");
ss << d.short_src;
ss << ": ";
ss << d.currentline;
ss << ": ";
if ( d.name != 0)
{
ss << d.namewhat;
ss << " ";
ss << d.name;
ss << ") ";
}
ss << lua_tostring(L, -1);
logger->log(ss.str().c_str(),ELL_ERROR);
return 1;
}
Вот вывод при запуске:
This is valid
1234
Сценарий останавливается вместо броскаисключение, как я ожидал.Есть ли способ контролировать, когда lua выдает исключение, или другой способ обработки ошибок?У меня есть настройка функции ведения журнала для получения отладочной информации, но точки останова показывают, что оператор catch выше не выполняется.
Спасибо!