Pedestal 0.4.0 includes io.pedestal.interceptor.error/error-dispatch, which uses core.match to make error handling very tidy. For example
(def my-error-handler
(error-int/error-dispatch [context ex]
;; match errors from body-params interceptor
{:interceptor :io.pedestal.http.body-params/body-params}
(let [response (-> (ring.util.response/response "Invalid data given") :status 400)]
(assoc context :response response))
;; match FileNotFoundException in the :enter stage
{:exception-type :java.io.FileNotFoundException :stage :enter}
;; respond to this error differently
;; pass along the error if we don't match
:else (assoc context :io.pedestal.impl.interceptor/error ex)
))creates an error handler that tries to matches any Throwable from ,
The error-dispatch macro splices its forms after the binding vector ([context ex] above) into a core.match expression matching against the ex-data of our exception, which is defined in io.pedestal.impl.interceptor, and contains :execution-id, :stage, :interceptor, :exception-type, and :exception.
So my-error-handler will respond with a 400 for any Throwable from the interceptor named :io.pedestal.http.body-params/body-param, etc.
Giving a nice separation between the semantically-correct error for an interceptor to throw (e.g. a parser error for invalid JSON) and the response that’s generated (a status 400 for invalid input).