如何在Clojure中使用自己的Java异常类?

如何在Clojure中使用自己的Java异常类?,java,exception,exception-handling,clojure,Java,Exception,Exception Handling,Clojure,我用Java编写了自己的异常(名为MyOwnException)类: package com.stackoverflow.clojure; import java.lang.RuntimeException; public class MyOwnException extends RuntimeException { private static final long serialVersionUID = 3020795659981708312L; public MyOw

我用Java编写了自己的异常(名为
MyOwnException
)类:

package com.stackoverflow.clojure;

import java.lang.RuntimeException;

public class MyOwnException extends RuntimeException {

    private static final long serialVersionUID = 3020795659981708312L;

    public MyOwnException(String s) {
        super("My own exception says: " + s);
    }

}
现在我想在Clojure代码中使用
MyOwnException
。我尝试了几种方法,但我总是得到类未找到异常(
.java
.clj
在同一个包中
com.stackoverflow.clojure
):

除此之外:纯Clojure中的解决方案会是什么样子?(异常类定义+用法)

更新(project.clj):


您是如何运行代码的?您是否先编译Java源代码?编译后,Java类文件是否在类路径中

我建议使用Leiningen,并为您的源代码使用不同的结构。不要在一个包中混用资源。例如,
src/main/java
src/main/clojure'

查看:。

使用

(import '[com.stackoverflow.clojure MyOwnException])
应该与

...
(-> (clojure.core/format "Expression '%s' not defined." x)(MyOwnException.)(throw))
...
或仅限全名:

...
(-> (clojure.core/format "Expression '%s' not defined." x)(com.stackoverflow.clojure.MyOwnException.)(throw))
...
由于您的问题中已经包含了正确的代码(未注释的部分),我猜您的REPL可能出了问题。也许您应该在运行以下代码组合之一之前重新启动它。 请记住:仅运行
(prn(casetest“error”)
不会自动更改函数的代码。您必须将完整的新代码发送到REPL(例如,使用runas/Clojure应用程序)


我正在使用Eclipse和逆时针插件。运行
leinjavac
在文件夹
target/classes/com/stackoverflow/clojure
中生成类文件。那么,它是否应该在不添加任何
import
-命令的情况下以这种方式工作?@Edward当您想在Clojure代码中使用Java类时,您必须导入它……或者使用完全限定的Java类名。“Clojure方式”可能是使用
...
(-> (clojure.core/format "Expression '%s' not defined." x)(MyOwnException.)(throw))
...
...
(-> (clojure.core/format "Expression '%s' not defined." x)(com.stackoverflow.clojure.MyOwnException.)(throw))
...
(ns com.stackoverflow.clojure.testForOwnExceptions)

(import '[com.stackoverflow.clojure MyOwnException])

(defn casetest [x]
  (case x
    "a" "An a."
    "b" "A b."
    (-> (clojure.core/format "Expression '%s' not defined." x)(MyOwnException.)(throw))
    ))

(prn(casetest "error"))
(ns com.stackoverflow.clojure.testForOwnExceptions)

(defn casetest [x]
  (case x
    "a" "An a."
    "b" "A b."
    (-> (clojure.core/format "Expression '%s' not defined." x)(MyOwnException.)(throw))
    ))

(prn(casetest "error"))