Janet 1.38.0-73334f3 Documentation
(Other Versions:
1.37.1
1.36.0
1.35.0
1.34.0
1.31.0
1.29.1
1.28.0
1.27.0
1.26.0
1.25.1
1.24.0
1.23.0
1.22.0
1.21.0
1.20.0
1.19.0
1.18.1
1.17.1
1.16.1
1.15.0
1.13.1
1.12.2
1.11.1
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))
Two error-handling forms built on fibers
try
Janet provides a simple macro try
to make error-handling a bit
easier in the common case. try
performs the function of a
traditional try/catch block; it will execute its body and, if any
error is raised, optionally bind the error and the raising fiber in
its second clause.
(try
(do
(print "inside block...")
(error "oops")
(print "will never get here"))
([err fib]
# err and (fiber/last-value fib) are the same here
(print "caught error: " err)
(print "fib's last-value: " (fiber/last-value fib))
# returns the status of fib, in this case, :error
(fiber/status fib)))
Note that in the above example, the caught err
and `fib`'s
last-value are the same, i.e. "oops".
protect
Janet also provides the protect
macro for a slightly different
flavor of error-handling, converting caught errors into further
expressions.
(protect
(if (> (math/random) 0.42)
(error "Good luck")
"Bad luck"))