error-handling - 如何正确打印来自 `luaL_dostring()`的错误消息?

标签 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,而没有任何关于错误发生位置的进一步描述。

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

最佳答案

luaL_dostring成功返回LUA_OK /* 0 */,失败则返回1 [1]。如果失败,它将在堆栈中推送一条错误消息,描述问题。这可以通过在docs [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;
}
  • [1] https://www.lua.org/manual/5.3/manual.html#luaL_dostring
  • [2] https://www.lua.org/manual/5.3/manual.html#lua_load
  • [3] https://www.lua.org/manual/5.3/manual.html#lua_pcall
  • 关于error-handling - 如何正确打印来自 `luaL_dostring()`的错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56230859/

    相关文章:

    python - 如何使用日志库? (用Python实现日志记录)

    error-handling - swift2 catch !失败错误

    lua - 魔兽世界中lua代码的问题

    swift - Swift 中除以 0 时捕获错误

    spring - @ControllerAdvice处理异常,但不自定义响应

    类和模块以及 Lua,哦,我的

    JavaScript、Lua、尾调用优化

    lua - 如何检查字符串中断字符?

    lua - FireBase API 是否有未缩小的 JavaScript 版本?

    php - PHP OOP处理UI的错误通知