So the moral of the story (in terms of idiomatic clojure) is to declare RuntimeExceptions instead of Exceptions (if you need to declare an exception)? Or is there a better way to handle errors?
Paul On Fri, Oct 24, 2008 at 7:39 AM, Rich Hickey <[EMAIL PROTECTED]> wrote: > > > > On Oct 23, 10:11 pm, jim <[EMAIL PROTECTED]> wrote: >> Rich, >> >> When I do the following: >> >> (gen-and-load-class 'user.UserException :extends Exception) >> >> (defn th [arg] >> (throw (new user.UserException "thrown exception"))) >> >> (defn test-fn [] >> (try >> (dorun (map th '(1 2 3))) >> (catch user.UserException e >> (println "caught" e)) >> (finally (println "finally clause")))) >> >> and then execute test-fn, the exception is not caught. >> >> user=> (test-fn) >> finally clause >> java.lang.RuntimeException: user.UserException: thrown exception >> (NO_SOURCE_FILE:0) >> >> So am I doing something wrong or is this a bug when an exception is >> thrown from inside a call to map? >> > > Currently ISeq (the interface for seqs) doesn't declare any exceptions > on first/rest, therefor no implementations, e.g. LazyCons, can throw > checked exceptions. So, if they encounter an exception in the > implementation closure, they have to wrap it in an unchecked > exception, like RuntimeException. > > This is a good example of why checked exceptions are bad - they force > intervening parties who should have no participation in the process to > be involved in exception declarations and handling, thereby thwarting > the basic premise of exceptions - communication between the party that > had the problem and the party that can do something about it. > > In any case, the only way to fix this is to declare that first/rest > throw Exception in ISeq, which would be a big change (because > everything that calls them would then have to declare exceptions, and > everything that calls them... - complete inanity). > > They definitely weren't thinking about closures and higher-order > programming when they invented checked exceptions - it invariably > leads to everything declaring they throw the root Exception, so why > bother? > > Rich > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---