Nitpick:<p>> While Common Lisp calls them “conditions”, I will stick with “error” in this post, because I don’t think “condition” is very self-explanatory if you’re not familiar with the language already. Please forgive my inaccuracy.<p>This is misleading. It is possible to signal conditions that are not errors, and therefore do not require stack unwinding, like errors do. The condition facility allows one to execute arbitrary code with arbitrary arguments at the SIGNAL site.<p>`SIGNAL` walks the list of condition handlers and executes the type-matching ones in order of their binding. If a handler returns normally, then next ones are executed; if all matching handlers are exhausted, `SIGNAL` returns, and code execution continues.<p><pre><code> CL-USER> (handler-bind ((condition (lambda (c) (format t ";; Foo: ~A~%" c)))
(condition (lambda (c) (format t ";; Bar: ~A~%" c)))
(condition (lambda (c) (format t ";; Baz: ~A~%" c))))
(signal 'condition)
42)
;; Foo: Condition CONDITION was signalled.
;; Bar: Condition CONDITION was signalled.
;; Baz: Condition CONDITION was signalled.
42
</code></pre>
Of course, a handler can perform a non-local transfer of control elsewhere, e.g. by using `GO` or `THROW`. In such a case, control is transferred out of `SIGNAL`, so next handlers are - naturally - not invoked.<p>While I understand that this post is trying to appeal to language newcomers, simplifying the whole condition system to an "error try-catch" is a drastic misrepresentation of the condition system that will leave the newbies with the impression that that's all that is possible with that feature. Since it seems that the author is a Lisp newcomer as well (which I wholeheartedly admire! :), I'd advise him to use the original notation of "condition", instead for the one of "error".