2010-09-30 17 views

Respuesta

24

Hacer un archivo src/user/MyException.clj (donde src está en CLASSPATH) que contiene:

(ns user.MyException 
    (:gen-class :extends java.lang.Exception)) 

comprobar el valor de *compile-path* en el REPL. Asegúrese de que este directorio exista y esté en CLASSPATH. Crea el directorio si no existe; Clojure no lo hará por ti.

user> *compile-path* 
"/home/user/foo/target/classes/" 
user> (System/getProperty "java.class.path") 
".......:/home/user/foo/target/classes/:......." 

Compile su clase:

user> (compile 'user.MyException) 
user.MyException 

Si funcionó, en *compile-path* ahora debería tener archivos o menos así:

/home/user/foo/target/ 
/home/user/foo/target/classes 
/home/user/foo/target/classes/user 
/home/user/foo/target/classes/user/MyException.class 
/home/user/foo/target/classes/user/MyException__init.class 
/home/user/foo/target/classes/user/MyException$loading__4410__auto__.class 

Reinicie su Clojure REPL/JVM para cargar estas clases . De nuevo, asegúrese de que estos nuevos archivos de clase estén en CLASSPATH. Ahora usted debería ser capaz de utilizar su clase:

user> (user.MyException.) 
#<MyException user.MyException> 
9

Fwiw, a menos que se está creando una excepción personalizada por razones de interoperabilidad es posible que desee considerar el uso de clojure.contrib.condition lugar. Viene con una excepción personalizada precompilada que permite utilizar datos personalizados en el uso de su API. Pude evitar crear muchas excepciones personalizadas usándolo en su lugar. Los documentos están aquí: http://clojure.github.com/clojure-contrib/condition-api.html

+1

Además se puede señalar clojure.contrib.error-kit. – kotarak

+2

'clojure-contrib' ahora está en desuso. – m0skit0

63

En lugar de generar clases personalizadas, hay dos formas mucho más simples de usar excepciones personalizadas:

  1. Uso slingshot - Esto proporciona personalizados throw+ y catch+ macros que le permiten deshacerse y atrapa cualquier objeto, así como excepciones.

  2. En clojure 1.4 y superior, puede utilizar clojure.core/ex-info y clojure.core/ex-data para generar y capturar una clase clojure.lang.ExceptionInfo, que envuelve un mensaje y un mapa de datos.

Usando esto es sencillo:

(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 "???")))) 

O en una prueba midje:

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

Muchas gracias, ¡he buscado durante mucho tiempo una solución simple para la gestión de excepciones transparentes en Clojure! –

+0

para excepciones personalizadas en ring-service, yo recomendaría usar el enfoque sugerido aquí: https://8thlight.com/blog/mike-knepper/2015/05/19/handling-exceptions-with-middleware-in-clojure .html – danfromisrael

Cuestiones relacionadas