异常处理

;; Clojure has no form for declaring an exception class.
;; The idiom is ex-info: one type, ExceptionInfo,
;; and the kinds are told apart by its DATA
(def denied (ex-info "Access denied" {:type :access-denied :user "kim"}))

(println "class is" (class denied))
(println "message is" (ex-message denied))
(println "data is" (pr-str (ex-data denied)))

(try
  (throw denied)
  (catch clojure.lang.ExceptionInfo e
    (println "caught kind" (:type (ex-data e)))))

;; ready-made Java types are available when a real class is wanted
(println "or a Java type:" (class (IllegalArgumentException. "bad arg")))