c++ - 如何使用 C API for Lua 在控制台中打印错误

标签 c++ c error-handling lua lua-c++-connection

我一直在四处寻找一种方法来处理 Lua 的 C API 错误,并在控制台中简单地打印出来。虽然,我找不到一个有效的例子。我想做的只是像这样:

static int test(lua_State *L)
{
  if(!lua_isstring(L, 1))
     return luaL_error(L, "This is not a valid string");    
}

static int test(lua_State *L)
{
    try
    {
        if (!lua_isstring(L, 1))
        {
            throw luaL_error(L, "This is not a valid string");
        }
    }
    catch (int e)
    {
        std::cout << "Error " << e << std::endl;
    }
}

但到目前为止没有任何效果。使用 LUA C API 进行错误处理并在控制台中显示消息的正确方法是什么?

最佳答案

第一个代码示例是处理 Lua 错误的正确方法之一,但您似乎对它的工作原理感到困惑。

您正在编写一个 C 函数来实现一个将暴露给 Lua 的接口(interface)。它像这样的 Lua 代码:

local function test(s)
    if type(s) ~= "string" then
        error("This is not a valid string")
    end
end

首先出错的代码不是 test 函数,而是使用无效参数调用它的代码。

当您的 Lua 代码以无效方式调用该函数时(例如 test(42)),它会引发 Lua 错误,并以字符串作为错误消息。如果您从标准 Lua 解释器调用它,它将停止程序,打印错误消息和堆栈跟踪。

如果你想在你的 Lua 代码中做一些其他的事情,例如只打印错误信息,你可以使用 pcall 捕获错误,这有点像其他语言中的 try/catch :

local ok, err_msg = pcall(test, 42)
if not ok then
    print(err_msg)
end

请注意,由于此错误是由无效参数类型引起的,您的代码可能会通过使用 luaL_checkstring 之一得到改进。/luaL_checklstring , luaL_argcheckluaL_argerror而不是直接使用 luaL_error。

要了解有关 C API 工作原理的更多信息,我建议您阅读“Programming in Lua(第 4 版)”一书中的专门部分。

关于c++ - 如何使用 C API for Lua 在控制台中打印错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44083399/

相关文章:

c++ - 将 RANSAC 应用于 vector<Point2f> 以进行相似性变换

c++ - 使用 boost::asio 时是否需要实现阻塞?

C++ 披萨订购程序不确定为什么会发生错误

Android - 如何在 Windows 上构建 native 库并在 Android NDK 中使用它

安卓 : what is the standard way to display errors to the user?

ruby - 如何更改 Rails 错误消息文本 "We' 抱歉,出了点问题。”

c++ - Google Filament渲染引擎分割错误

c - 在 Linux 上使用 gcc 并在 Windows 上使用 MinGW 构建共享库

c - 使用函数中的参数添加多个整数

ios - 错误代码1886681407 AudioFileGetProperty给什么?