-
Notifications
You must be signed in to change notification settings - Fork 196
Exception handling
Although people might think that a modern language needs try/catch, the usual Lua pcall idiom is not as clumsy in MoonScript, especially if we specialize it for the case where the function return value is not important.
For example,
try = (f) ->
ok,err = pcall f
if not ok then err\gsub '^[^:]+:%d+: ',''
err = try ->
print a.x
if err
print 'error!',err
--~ error! attempt to index global 'a' (a nil value)An even more suggestive syntax can constructed, thanks to SelectricSimian:
try
do: ->
print a.x
catch: (e) ->
print 'error!',e
finally: ->
print 'gets here'We are exploiting the fact that Moonscript allows a table with only key-value pairs to be specified without curly braces. The definition of try is very simple:
try = (t) ->
ok,err = pcall t.do
if not ok
t.catch err
t.finally! if t.finallyThe simple implementation above still differs to what people are usually expecting regarding the finally function.
finally is to be executed in all cases while our simple approach skips it in the case catch errors again. (Which is not that uncommon.)
This more complex version also returns the evaluated do or catch and thus can be used in assignments.
try = (t) ->
-- ok, value = xpcall(t.do, errorHandler)
ok, value = pcall(t.do)
if ok
t.finally! if t.finally
return value
else
handled, backup_value = pcall(-> t.catch(value))
t.finally! if t.finally
if handled
return backup_value
else
error(backup_value, 2)