如何从 'luaL_dostring()' 中正确打印错误消息?

下面是运行 Lua 脚本字符串的代码。

bool doString(const char *s)
{
    const int ret = luaL_dostring(L, s);
    if (ret)
    {
        if (ret == LUA_ERRSYNTAX)
            printf("错误:%s"lua_tostring(L, -1));
        else if (ret == LUA_ERRMEM)
            printf("错误:内存错误");
        else
            printf("错误:语法错误");
        return false;
    }
    return true;
}

但在许多情况下,我的代码只打印“错误:语法错误”,而没有进一步的描述错误发生的位置。

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

点赞
用户2047576
用户2047576

luaL_dostring 执行成功时返回 LUA_OK /* 0 */,执行失败时返回 1 [1]。执行失败时,会将一个描述问题的错误信息推入堆栈中。可以通过文档中的 luaL_loadstring 跟踪到 lua_load 来判断这一点[2]。另外,luaL_dostring 会调用 lua_pcall,当 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;
}
2019-05-21 09:47:56