Lua语法错误的描述性错误消息

时间:2016-06-13 02:39:38

标签: c++ error-handling lua

我有一个Lua解释器,每当我在代码中出现语法错误时,返回的错误消息只是attempted to call a string value,而不是有意义的错误消息。例如,如果我运行这个lua代码:

for a= 1,10
   print(a)
end

不会返回有意义的'do' expected near 'print'和行号,而是返回错误attempted to call a string value

我的C ++代码如下:

void LuaInterpreter::run(std::string script) {
    luaL_openlibs(m_mainState);

    // Adds all functions for calling in lua code
    addFunctions(m_mainState);

    // Loading the script string into lua
    luaL_loadstring(m_mainState, script.c_str());

    // Calls the script
    int error =lua_pcall(m_mainState, 0, 0, 0);
    if (error) {
        std::cout << lua_tostring(m_mainState, -1) << std::endl;
        lua_pop(m_mainState, 1);
    }
}

提前致谢!

2 个答案:

答案 0 :(得分:7)

您的问题是luaL_loadstring无法加载字符串,因为它不是有效的Lua代码。但你从来没有费心去检查它的返回值来找出它。因此,您最终尝试执行它推入堆栈的编译错误,就像它是一个有效的Lua函数一样。

使用此功能的正确方法如下:

auto error = luaL_loadstring(m_mainState, script.c_str());
if(error)
{
    std::cout << lua_tostring(m_mainState, -1) << std::endl;
    lua_pop(m_mainState, 1);
    return; //Perhaps throw or something to signal an error?
}

答案 1 :(得分:1)

我能够通过替换

解决问题
luaL_loadstring(m_mainState, script.c_str());

// Calls the script
int error =lua_pcall(m_mainState, 0, 0, 0);

代码

int error = luaL_dostring(m_mainState, script.c_str());