try
位于一个宏中,位于第一个宏catch
调用的第二个宏中。如何让以下工作?
(defmacro catch-me []
`(catch ~'Exception ~'ex
true))
(defmacro try-me []
`(try (+ 4 3)
(catch-me)))
扩展try-me
看起来不错:
(clojure.walk/macroexpand-all '(try-me))
产量
(try (clojure.core/+ 4 3) (catch Exception ex true))
但调用 (try-me) 会产生:
"Unable to resolve symbol: catch in this context",
顺便说一句,这也是您在未尝试使用 catch 时会在 REPL 中收到的消息。
更新:
这就是我如何让它工作(感谢@Barmar),在这里你可以看到我的代码的实际上下文:
(defmacro try-me [& body]
`(try
~@body
~@(for [[e msg] [[com.mongodb.MongoException$Network "Database unreachable."]
[com.mongodb.MongoException "Database problem."]
[Exception "Unknown error."]]]
`(catch ~e ~'ex
(common/site-layout
[:div {:id "errormessage"}
[:p ~msg]
[:p "Error is: " ~e]
[:p "Message is " ~'ex]])))))
但这就是我所希望的(使用单独的宏catch-me
):
(defmacro try-me [& body]
`(try
~@body
(catch-me com.mongodb.MongoException$Network "Database unreachable.")
(catch-me com.mongodb.MongoException "Database problem.")
(catch-me Exception "Unknown error.")))
我认为这会更容易编写/维护。
有任何想法吗?我需要语法引用,因为我正在传递参数,这就是为什么不幸的是 Arthur 的答案无法应用(或者可以以某种方式应用?),但我直到现在才发布我的实际上下文。