blob: bc3abd7dd6fd4448479f5a4865d8a4191dea21d3 [file] [log] [blame]
-- $Id: except.lua,v 1.2 2004-05-23 04:36:29 bfulgham Exp $
-- http://www.bagley.org/~doug/shootout/
-- from Roberto Ierusalimschy
-- uses `call' to catch errors; return the error message
-- (or nil if there are no errors)
function try (f, arg)
local status, err = pcall(f, arg)
if not status then return err end
end
local HI = 0
local LO = 0
function some_function (n)
local res = try(hi_function, n)
if res then print("We shouldn't get here: " .. res) end
end
function hi_function (n)
local res = try(lo_function, n)
if res == "Hi_Exception" then HI = HI+1
elseif res then error(res, 0) -- rethrow
end
end
function lo_function (n)
local res = try(blowup, n)
if res == "Lo_Exception" then LO = LO+1
elseif res then error(res, 0) -- rethrow
end
end
function blowup (n)
if math.fmod(n,2) ~= 0 then error("Lo_Exception", 0)
else error("Hi_Exception",0)
end
end
N = (arg and arg[1]) or 1
for i=1,N do
some_function(i)
end
print(string.format("Exceptions: HI=%d / LO=%d", HI, LO))