C ++ не перехватывает исключения lua - PullRequest
0 голосов
/ 02 августа 2011

У меня есть программа на 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 выше не выполняется.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 02 августа 2011

Если вы хотите загрузить скрипт Lua через Luabind, вы не можете использовать luaL_dofile или другие обычные функции Lua для этого. Вы должны использовать функции Luabind. Так это будет выглядеть примерно так:

namespace lb = luabind;
int luaError = luaL_loadfile(pLuaState, "scripts/start.lua");
//Check for errors

lb::object compiledScript(lb::from_stack(pLuaState, -1));
lb::call_function<void>(compiledScript); //Call the script.

lua_pop(pLuaState, 1); //Remove the script from the stack. It's stored in our luabind::object
2 голосов
/ 02 августа 2011

luaL_dofile() не является частью Luabind, поэтому я не ожидаю каких-либо исключений Luabind от него. Установленный вами обработчик используется / передается, когда Luabind сам вызывает что-то из Lua (используя pcall()). luaL_dofile() является частью базового кода Lua (суффикс L помечает его как библиотечную обертку для упрощения вызовов) и обычного C, поэтому вам придется самостоятельно обрабатывать ошибки (никогда не использовал исключения в Lua / Luabind, если честно) после звонка.

Не проверено, но следующий код должен делать то, что вы ожидали от вашего кода:

if(!luaL_doFile(L, "scripts/start.lua"))
    theCallback(L);
...