Flexible raising and handling of conditions:


raise: raises a condition
handler-case: dispatches raised conditions to appropriate handlers
print-stack-trace: prints abbreviated or full condition stack traces


A condition is a map containing values for these keys:

- :type, a condition type specifier, typically a keyword
- :stack-trace, a stack trace to the site of the raise
- :message, a human-readable message (optional)
- :cause, a wrapped exception or condition (optional)
- other keys given as arguments to raise (optional)

Note: requires AOT compilation.

Based on an idea from Chouser:

Vars in clojure.contrib.condition