马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
由于紫猫手机插件代码行数已经6800多行了, 打算重构下, 故整理了本篇教程.
在lua中, 可以使用pcall或xpcall保护模式执行代码, error抛出异常, 所以利用这些特性来实现try...catch...finally功能
普通写法
[Lua] 纯文本查看 复制代码
function cc(a, b)
-- try
local ok, errors = pcall(
function ()
return a + b
end
)
-- catch
if not ok then
print("错误信息:", errors)
end
-- finally
print("必定执行的内容")
if ok then
return errors
else
return nil
end
end
print(cc(1, nil))
print(cc(1, 2))
封装后的写法
[Lua] 纯文本查看 复制代码
local function try(block)
local tablejoin = function (...)
local result = {}
for _, t in ipairs({...}) do
if type(t) == "table" then
for k, v in pairs(t) do
if type(k) == "number" then table.insert(result, v)
else result[k] = v end
end
else
table.insert(result, t)
end
end
return result
end
-- get the try function
local try = block[1]
assert(try)
-- get catch and finally functions
local funcs = tablejoin(block[2] or {}, block[3] or {})
-- try to call it
local result_error = {}
local results = {pcall(try)}
if not results[1] then
-- run the catch function
if funcs and funcs.catch then
result_error = {funcs.catch(results[2])}
end
end
-- run the finally function
if funcs and funcs.finally then
local result_fin = {funcs.finally(table.unpack(results))}
if #result_fin > 0 then
return table.unpack(result_fin)
end
end
-- ok?
if results[1] and #results > 1 then
return table.unpack(results, 2, #results)
else
if #result_error > 0 then
return table.unpack(result_error)
else
return nil
end
end
end
local function catch(block)
-- get the catch block function
return {catch = block[1]}
end
local function finally(block)
-- get the finally block function
return {finally = block[1]}
end
function bb()
return try
{
-- try 代码块
function ()
error("出错了")
end,
-- catch 代码块
catch
{
-- 发生异常后,被执行
function (errors)
print("执行bb()错误:", errors)
end
},
-- finally 代码块
finally
{
-- 最后都会执行到这里
function (ok, errors)
-- 如果try{}中存在异常,ok为true,errors为错误信息,否则为false,errors为try中的返回值
print("必定执行内容:", ok, errors)
end
}
}
end
bb()
|