2010-09-30 28 views
42

Clojure'de kullanıcı tanımlı bir özel durum oluşturmaya çalışıyorum ve her türden sorun yaşadım. Ben metod burada özetlenen çalıştı:Clojure Özel İstisnalar?

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

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

Ama bu Clojure 1.2 çalışmak görünmüyor (ya da ben ... yanlış bir şey yapıyorum). Benim çevrem Clojure 1.2, Emacs ve lein swank.

Yardımlarınız için teşekkürler!

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

REPL de *compile-path* değerini kontrol edin: içerikli

cevap

24

(srcCLASSPATH üzerinde olduğu) bir dosya src/user/MyException.clj olun. Bu dizinin var olduğundan ve CLASSPATH açık olduğundan emin olun. Varsa dizini yaratın; Clojure senin için yapmayacak. işe yaradı ise *compile-path* yılında artık böyle dosyalar şey olması gerekir,

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

:

/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 

bu sınıflar yüklemek için Clojure REPL/JVM yeniden başlatın

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

sınıfınızı derlemek . Yine, bu yeni sınıf dosyalarının CLASSPATH'da olduğundan emin olun. Eğer birlikte çalışma nedeniyle özel bir istisna oluşturarak sürece bunun yerine clojure.contrib.condition kullanarak düşünebilir,

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

FWIW: Artık sınıfını kullanmak mümkün olmalıdır. Özel verileri, API'sini kullanarak üzerine özel bir şekilde piggy-back yaptığınız önceden derlenmiş bir özel istisna ile birlikte gelir. Bunun yerine birçok özel istisna oluşturmamaya başladım. docs Buradasınız: özel sınıflar oluşturarak, özel istisnalar kullanmanın iki çok daha basit yolları vardır yerine http://clojure.github.com/clojure-contrib/condition-api.html

+1

Ayrıca bir clojure.contrib.error-kit işaret edebilir. – kotarak

+2

'clojure-contrib' artık kullanımdan kaldırıldı. – m0skit0

63

:

  1. Kullanım slingshot - bu atalım özel throw+ ve catch+ makro sağlar ve istisnaların yanı sıra herhangi bir nesneyi yakalamak. Clojure 1.4 olarak

  2. ve üzeri, sen clojure.core/ex-info ve clojure.core/ex-data oluşturmak için kullandığımız ve bir mesaj ve verileri haritası sarar bir clojure.lang.ExceptionInfo sınıf yakalayabilirsiniz. Bu kullanma

basittir:

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

Veya midje testinde

:

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

Çok teşekkürler, Clojure'deki trasparent istisna yönetimine yönelik basit bir çözüm için uzun zamandır aradım!Ring hizmetindeki özel istisnalar için –

+0

, burada önerilen yaklaşımı kullanmanızı öneririm: https://8thlight.com/blog/mike-knepper/2015/05/19/handling-exceptions-with-middleware-in-clojure .html – danfromisrael