Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local errorStack = {}
- local mFinally = nil
- local patt = { { ".* attempt to call nil", "NIL_FUNCTION_EXCEPTION" } }
- function errorToException(err)
- for k,v in pairs( patt ) do
- if string.find( err, v[1] ) then return v[2] end
- end
- return "UNHANDLED_EXCEPTION"
- end
- local function doFinally()
- if mFinally == nil or mFinally == "" then return end
- func,err = loadstring(mFinally)
- if func == nil then error(err) end
- setfenv(func,getfenv())
- local myErrorStack = errorStack
- local mmFinally = mFinally
- errorStack = {}
- mFinally = ""
- if func then pcall(func) end
- errorStack = myErrorStack
- mFinally = mmFinally
- end
- function sFinally(str)
- mFinally = str
- end
- function try(str)
- func,err = loadstring(str)
- errorStack = {}
- if func then
- setfenv(func,getfenv())
- local myErrorStack = errorStack
- errorStack = {}
- local arg = {pcall(func)}
- errorStack = myErrorStack
- local errVal = table.remove(arg,1)
- if not errVal then
- table.insert(errorStack,errorToException(arg[1]))
- else
- doFinally()
- end
- else
- table.insert(errorStack,errorToException(err))
- end
- end
- function catch(err, str)
- if #errorStack == 0 then return end
- local lErr = table.remove(errorStack)
- if lErr == err then
- func,err = loadstring(str)
- if func == nil then doFinally() error(err) end
- setfenv(func,getfenv())
- local myErrorStack = errorStack
- errorStack = {}
- if func then
- pcall(func)
- end
- errorStack = myErrorStack
- doFinally()
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment