Use `ex-info`, `ex-data`, and explicit error values so failures stay understandable in production.
Error handling is not just “try/catch.” It’s part of your design: where do errors belong, who is responsible for recovery, and how do you keep failures observable?
This section covers a few idiomatic Clojure patterns: throwing exceptions with structured data (ex-info / ex-data), returning explicit error values where flows are clearer, and keeping recovery logic at system boundaries.
For Java engineers, the shift is often moving from “exception types as control flow” toward “errors as data plus explicit boundaries.”