使用 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