在Lua C处理程序中,我在抛出错误之前在注册表中设置了一个标志。如果使用pcall
从Lua调用处理程序,我想确保设置(或清除)此标志。以下是更多细节:
我使用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
答案 0 :(得分: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函数的语法不太确定,但我认为这将是它的基本要点。