结论
- 多层方法调用、参数传递,使用 table 而不是 … 来传参会更好
过程
1、变成过程中,发现这样写会有问题
function SafeCallFun(func, ...)
return xpcall(function() func(...) end, function(errinfo)
-- do something
end)
end
2、报错
lua: test.lua:2: cannot use '...' outside a vararg function near '...'
3、于是尝试对 … 进行包装,但是会丢失 nil 参数
-- 经过参数传递会丢失参数
function SafeCall1(func, ...)
-- unpack table 会丢失 nil 参数
local args = unpack({...})
return xpcall(function() func(args) end, function(errinfo)
-- do something
end)
end
4、于是把函数调用放到外面
-- 可能这样会更好
function SafeCall2(func)
return xpcall(func, function(errinfo)
-- do something
end)
end
function SomeFunc()
local func = function()
-- do something
end
SafeCall2(func)
end