如何在Clojure宏中包装Exception?

Ert*_*tin 3 lisp macros functional-programming clojure

我想包装由系统或用户抛出的异常(无关紧要)并强制它返回一些值.

我为它写了宏,但它不起作用.

宏:

(defmacro safe-fn
  [form]
  (try
    `(do ~form)
    (catch Throwable e
      1)))
Run Code Online (Sandbox Code Playgroud)

用法: (safe-fn (throw (RuntimeException. "Try me!")))

实际产量: RuntimeException Try me! clojure-brave-and-true.core/eval2219 (form-init6122238559239237921.clj:1)

期望的输出: 1

Sam*_*tep 7

宏只是返回要评估的代码的函数,因此您可以这样编写safe-fn:

(defmacro safe-fn
  [form]
  `(try
     ~form
     (catch Throwable ~'_
       1)))
Run Code Online (Sandbox Code Playgroud)

例:

(safe-fn (throw (RuntimeException. "Try me!")))
;=> 1
Run Code Online (Sandbox Code Playgroud)

有关宏的更多详细信息,请参阅我对此问题的回答,特别是使用它们来捕获异常.