2

在 Lua C 处理程序中,我在抛出错误之前在注册表中设置了一个标志。如果从 Lua 使用pcall. 以下是更多详细信息:

我有一个handle从 C 调用的基本 Lua 函数,使用lua_pcall

function handle()
  c_handle()
end

C 中的句柄具有以下基本结构,我们希望在抛出错误之前设置一个标志,以区分错误与其他错误。

int c_handle(lua_State *L)
{
  if (condition) {
    set a flag in registry
    throw error with lua_error
}

我遇到的问题是,如果 Lua 使用 pcall 调用处理程序,我不想设置注册表标志或清除它:

function handle()
  pcall(c_handle)
end
4

1 回答 1

1

您可以将脚本沙箱化并替换pcall为您自己的可以回调的版本c_handle(),如下所示:

local newenv = {
    pcall = function(f, arg1, arg2, ...)
        if pcall(f, arg1, arg2, ...) then
            c_handle(true) -- no error, pass true to c_handle
        else
            c_handle(false) -- error, pass false to c_handle
        end if
    end
}
setmetatable(newenv, {__index = _G})
setfenv(1, newenv)

因此,现在当您进行受保护的呼叫时,它将通过c_handle.

编辑

不太确定将参数传递给 C 函数的语法,但我想这将是它的基本要点。

于 2013-01-29T02:18:54.187 回答