如何正确地从`luaL_dostring()`打印错误消息?

时间:2019-05-21 03:55:33

标签: error-handling lua

这是我的代码,它以字符串形式运行Lua脚本。

bool doString(const char *s)
{
    const int ret = luaL_dostring(L, s);
    if (ret)
    {
        if (ret == LUA_ERRSYNTAX)
            printf("Error: %s", lua_tostring(L, -1));
        else if (ret == LUA_ERRMEM)
            printf("Error: memory error");
        else
            printf("Error: syntax error");
        return false;
    }
    return true;
}

但是在很多情况下,我的代码仅显示Error: syntax error,而没有任何关于错误发生位置的进一步描述。

如何正确打印错误消息,使其更具描述性?

1 个答案:

答案 0 :(得分:2)

luaL_dostring成功返回LUA_OK /* 0 */,失败[1]返回1。如果失败,它将在堆栈中推送一条错误消息,描述问题。这可以通过在文档[2]中遵循luaL_loadstringlua_load来确定。此外,luaL_dostring会调用lua_pcall,当失败(没有设置处理程序)时,它也会将错误对象压入堆栈[3]

当您得到非零结果时,您可以检查堆栈顶部是否有错误消息并打印:

bool doString(const char *s) {
    const int ret = luaL_dostring(L, s);

    if (ret != LUA_OK) {
      printf("Error: %s\n", lua_tostring(L, -1));
      lua_pop(L, 1); // pop error message
      return false;
    }

    return true;
}