gpt4 book ai didi

clojure - 如何捕获编译时异常?

转载 作者:行者123 更新时间:2023-12-02 11:19:11 30 4
gpt4 key购买 nike

Clojure 是否可以捕获编译时发生的异常?使用 try/catch 对于运行时异常来说很好而且很容易,但假设我有:

(defmacro will-throw-at-compile [] (assert false "it threw"))

(try (will-throw-at-compile) (catch Exception e "caught it"))

我找不到任何方法来捕捉这个,捕捉永远不会发生。我也尝试了不同类型的异常类,似乎不是问题。

我还认为,由于上面的 try 是运行时调用,所以制作一个宏在编译时执行 try:

(defmacro t [x] (try x (catch Exception e "caught it")))

也不起作用:

(t (will-throw-at-compile))

也许做不到?

最佳答案

如果宏处理它自己的异常,则可以使其工作。将宏的大部分工作分解为一个函数:

(defn thrower []
(throw (Exception. "it threw")))

(defmacro will-throw
[]
(try
(thrower)
(catch Exception e (println "caught it")))
(println "leaving macro"))

(will-throw)

运行此代码会导致:

> lein run
caught it
leaving macro

这个想法是将大部分或全部宏功能放入常规函数中,以便可以在编译时宏机制之外调用和测试它。然后您可以使用常规单元测试,如下所示:

(deftest t-thrower
(is (thrown? Exception (thrower)))
(println "t-thrower complete"))

> lein test
caught it
leaving macro

lein test tst.clj.core
t-thrower complete

Ran 1 tests containing 1 assertions.
0 failures, 0 errors.

关于clojure - 如何捕获编译时异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32413662/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com