;;; there is a simple, but not a good way ;;; (deftry foo [x] x) ;;; (:arglists (meta #'foo)) => ([& args__5399__auto__]) (defmacro deftry [name & fdecl] `(defn ~name [& args#] (try (apply (fn ~@fdecl) args#) (catch Error e# (println "err caught" e#)))))
;;; this is much more better ;;; (deftry foo [x] x) ;;; (:arglists (meta #'foo)) => ([x]) (defn wrap-try [f] (fn [& args] (try (apply f args) (catch Error e (println "err caught" e))))) (defmacro deftry [& fdecl] `(doto (defn ~@fdecl) (alter-var-root wrap-try))) On Sunday, August 31, 2014 6:26:12 PM UTC+8, Yehonathan Sharvit wrote: > > I tried to write a macro that wraps the code a function with a try/catch > statement. It works fine for regular functions but it doesn't work for > multimethods. I understand the reason, but I don't know how to fix it. > > Here is my code: > > (defmacro deftry [name args & body] " > https://groups.google.com/forum/#!topic/clojurescript/To0AnQVC3lg" > `(defn ~name ~args > (try ~@body > (catch Error e# > (println "error caught:" e#))))) > > > Usage: > 1. regular function => it works fine > > (deftry foo [] > (throw (Error. "foo"))) > > > 2. multimethods => it breaks > (deftry foo > ([a] 3) > ([] 5)) > > -- 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 Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.