You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.6 KiB
Lua
72 lines
1.6 KiB
Lua
--[[
|
|
https://github.com/moteus/lua-try
|
|
https://github.com/djfdyuruiry/lua-try-catch-finally
|
|
]]
|
|
local functionType = "function"
|
|
local xpcall = xpcall
|
|
local type = type
|
|
local error = error
|
|
local debug = debug
|
|
|
|
---
|
|
-- @param tryBlock any The block of code to execute as the try block.
|
|
--
|
|
-- @return table that can be used to chain try/catch/finally blocks. (Call .catch or .finally of the return value)
|
|
--
|
|
return function(tryBlock)
|
|
local status, err = true, nil
|
|
|
|
if type(tryBlock) == functionType then
|
|
status, err = xpcall(tryBlock, debug.traceback)
|
|
end
|
|
|
|
local finally = function(finallyBlock, catchBlockDeclared)
|
|
if type(finallyBlock) == functionType then
|
|
finallyBlock()
|
|
end
|
|
|
|
if not catchBlockDeclared and not status then
|
|
error(err)
|
|
end
|
|
end
|
|
|
|
local catch = function(catchBlock)
|
|
local catchBlockDeclared = type(catchBlock) == functionType
|
|
|
|
if not status and catchBlockDeclared then
|
|
local ex = err or "unknown error occurred"
|
|
catchBlock(ex)
|
|
end
|
|
|
|
return {
|
|
finally = function(finallyBlock)
|
|
finally(finallyBlock, catchBlockDeclared)
|
|
end,
|
|
}
|
|
end
|
|
|
|
return {
|
|
catch = catch,
|
|
finally = function(finallyBlock)
|
|
finally(finallyBlock, false)
|
|
end,
|
|
}
|
|
end
|
|
|
|
-- local try = require "try"
|
|
|
|
-- local object
|
|
|
|
-- try(function ()
|
|
-- object = Object()
|
|
-- object:doRiskyStuff()
|
|
-- end)
|
|
-- .catch(function (ex)
|
|
-- print(ex)
|
|
-- end)
|
|
-- .finally(function ()
|
|
-- if object then
|
|
-- object:dispose()
|
|
-- end
|
|
-- end)
|