;;; 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.

Reply via email to