Event callbacks (and error handling in general)
Any parameter labelled event-cb
is what’s known as an “event callback.” Event
callbacks have one argument: a condition describing the event that caused them
to be invoked. Originally event callbacks were failure callbacks, but since
non-failure conditions are sometimes useful to an app, it made sense to make it
more generic.
Application error handling
cl-async can be set up to catch errors in your application and pass them to
your event-cb
. This makes for seamless error handling, and keeps a rogue
condition from exiting the event loop (assuming you have an event-cb
set for
the operation that generated the condition, or a default event handler that
deals with the condition).
Note that the following variables are also controllable on a per-event-loop
basis via the start-event-loop keyword arguments
:catch-app-errors
and :default-event-cb
. It might actually be favorable to
use start-event-loop since it creates thread-local versions
of these variables when instantiating, which can be useful if running event
loops in multiple threads.
*catch-application-errors*
default: nil
By setting this to true, you allow cl-async to catch conditions in your app and pass them to the event callback associated with the procedure that triggered the condition.
If this is left as nil
, triggered conditions will make their way to the top
level and cause the event loop to exit, cancelling any pending events (unless
you have restarts implemented in your app).
*default-event-handler*
When *catch-application-errors* is set to t
and an event-cb
is not specified for an operation, the function assigned to
this variable will be used as the event-cb
. The default:
(lambda (ev)
;; throw the event so we can wrap it in a handler-case
(handler-case (error ev)
;; got a connection error, throw it (must do this explicitely since
;; event-error extends event-info)
(event-error () (error ev))
;; this is just info, let it slide
(event-info () nil)))
This can be changed by your application if different behavior is desired.