Skip to main content
 首页 » 编程设计

exception之Clojure 中的自定义异常

2024年05月22日14softidea

我一直在尝试在 Clojure 中创建用户定义的异常,但遇到了各种各样的问题。我尝试了这里概述的方法:

http://en.wikibooks.org/wiki/Clojure_Programming/Concepts#User-Defined_Exceptions

(gen-and-load-class 'user.MyException :extends Exception) 

但这似乎在 Clojure 1.2 中不起作用(或者我做错了什么......)。我的环境是 Clojure 1.2、Emacs 和 lein swank。

感谢您的帮助!

请您参考如下方法:

有两种更简单的方法来使用自定义异常,而不是生成自定义类:

  1. 使用slingshot - 这提供了自定义的 throw+catch+ 宏,让您可以抛出和捕获任何对象以及异常。

  2. 在 clojure 1.4 及更高版本中,您可以使用 clojure.core/ex-infoclojure.core/ex-data生成并捕获 clojure.lang.ExceptionInfo 类,该类包装消息和数据映射。

使用起来很简单:

(throw (ex-info "My hovercraft is full of eels" 
                {:type :python-exception, :cause :eels})) 
 
(try (...) 
  (catch clojure.lang.ExceptionInfo e 
    (if (= :eels (-> e ex-data :cause)) 
      (println "beware the shrieking eels!") 
      (println "???")))) 

或者在 midje 测试中:

(fact "should throw some eels" 
    (...)  
    => (throws clojure.lang.ExceptionInfo 
          #(= :eels (-> % ex-data :cause))))