使用 FFI 的 luaJIT 错误处理调用了一个不存在的方法
luaJIT error handling with FFI calls a non-existent method
我想避免的是capture/ignoreFFI调用一个不存在的方法时的异常
例如,下面的代码调用了non_existent_method
。但是,pcall
无法处理错误。
local ffi = require "ffi"
local C = ffi.C
ffi.cdef [[
int non_existent_method(int num);
]]
local ok, ret = pcall(C.non_existent_method, 1)
if not ok then
return
end
我在 OpenResty/lua-nginx-module 中遇到以下错误。
lua entry thread aborted: runtime error: dlsym(RTLD_DEFAULT, awd): symbol not found
一个可能的解决方案是用 lua 函数包装 C.non_existent_method
调用。
例如
local ok, ret = pcall(function()
return C.non_existent_method(len)
end)
if not ok then
......
end
另一种方法是直接调用索引元方法:
你可能想把它包装成一个函数:
local ffi_mt = getmetatable(ffi.C)
function is_valid_ffi_call(sym)
return pcall(ffi_mt.__index, ffi.C, sym)
end
示例:
ffi.cdef[[void (*foo)();]]
ffi.cdef[[int puts(const char *);]]
a,func = is_valid_ffi_call("foo")
-- false, "error message: symbol not found or missing declaration, whatever it is"
a,func = is_valid_ffi_call("puts")
-- true, cdata<int ()>: 0x7ff93ad307f0
我想避免的是capture/ignoreFFI调用一个不存在的方法时的异常
例如,下面的代码调用了non_existent_method
。但是,pcall
无法处理错误。
local ffi = require "ffi"
local C = ffi.C
ffi.cdef [[
int non_existent_method(int num);
]]
local ok, ret = pcall(C.non_existent_method, 1)
if not ok then
return
end
我在 OpenResty/lua-nginx-module 中遇到以下错误。
lua entry thread aborted: runtime error: dlsym(RTLD_DEFAULT, awd): symbol not found
一个可能的解决方案是用 lua 函数包装 C.non_existent_method
调用。
例如
local ok, ret = pcall(function()
return C.non_existent_method(len)
end)
if not ok then
......
end
另一种方法是直接调用索引元方法: 你可能想把它包装成一个函数:
local ffi_mt = getmetatable(ffi.C)
function is_valid_ffi_call(sym)
return pcall(ffi_mt.__index, ffi.C, sym)
end
示例:
ffi.cdef[[void (*foo)();]]
ffi.cdef[[int puts(const char *);]]
a,func = is_valid_ffi_call("foo")
-- false, "error message: symbol not found or missing declaration, whatever it is"
a,func = is_valid_ffi_call("puts")
-- true, cdata<int ()>: 0x7ff93ad307f0