When I put on my C hat, I think that maybe idiomatic Clojure just does the simple thing and checks return values.
When I put on my Java hat (reluctantly, I must add), I think to myself that since Clojure runs on the JVM the natural way must be to use JVM exceptions.
When I put on my functional hat, I'm thinking that there must be some sort of monadic construction or threading macro that can handle errors in a composable way.
So what's the idiomatic way to handle errors in a Clojure program?