Janet 1.11.1-4cc6809 Documentation
(Other Versions:
1.10.1
1.9.1
1.8.1
1.7.0
1.6.0
1.5.1
1.5.0
1.4.0
1.3.1
)
Error Handling
One of the main uses of fibers is to encapsulate and handle errors. Janet offers
no direct try/catch mechanism like some languages, and instead builds error
handling on top of fibers. When a function throws an error, Janet creates a
signal and throws that signal in the current fiber. The signal will be
propagated up the chain of active fibers until it hits a fiber that is ready to
handle the error signal. This fiber will trap the signal and return the error
from the last call to resume
.
(defn block
[]
(print "inside block...")
(error "oops"))
# Pass the :e flag to trap errors (and only errors).
# All other signals will be propagated up the fiber stack.
(def f (fiber/new block :e))
# Get result of resuming the fiber in res.
# Because the fiber f traps only errors, we know
# that after resume returns, f either exited normally
# (has status :dead), or threw an error (has status :error)
(def res (resume f))
(if (= (fiber/status f) :error)
(print "caught error: " res)
(print "value returned: " res))
Janet also provides a simple macro try
to make this a bit easier in the
common case.
(try
(do
(print "inside block...")
(error "oops")
(print "will never get here"))
([err] (print "caught error: " err)))