更好的处理clojure异常的方法以及为什么我的异常没有在go块中捕获

时间:2015-04-20 14:30:44

标签: clojure

我试图找到一种更好的方法来处理clojure中的异常,我使用https://github.com/alaisi/postgres.async在失败时抛出一个异常,但我更希望返回false(因为我' m使用验证器)或甚至更好的东西,如Either monad(或更简单的东西,如http://adambard.com/blog/acceptable-error-handling-in-clojure/

1)我试图捕获异常并且如果存在则返回false,但代码不起作用(不返回false并抛出异常)。

(try
      (dosql [tx (<begin! db)
                 ucount (<execute! tx ["UPDATE groups SET garticlescounter=garticlescounter + 1 WHERE gid=$1"
                                       groupid])
                 uartc (<execute! tx ["UPDATE subtopics SET starticlescount=starticlescount + 1 WHERE stid=$1"
                                      sid])
                 uartins (<insert! tx
                                   {:table "articles"}
                                   {:aurl url :atitle title :asuttopicid sid :acommentcount 0 :alikescount 0 :auid uid})
                 ok? (<commit! tx)]
                ok?)
      (catch Exception _ false))

2)如果作品返回正常,可能会换一种方式吗?如果不工作返回false,或者可能[好吧? nil]和[nil error]可能是一个宏?

----感谢swinn我做了这个

;must receive an optional parameter for error response or 
; build a [nil ok] response but just know this works for me...
(defmacro async-try-block! [block]
  `(let [chn# (!/chan 1)]
     (!/go
       (let [response# (try
                        ~block
                        (catch Throwable e#))]
         (if (instance? Throwable response#) (!/put! chn# false) (!/put! chn# response#))))
     chn#))

(async-try-block!
    (dosql [tx (<begin! db)
            ucount (<execute! tx ["UPDATE groups SET garticlescounter=garticlescounter + 1 WHERE gid=$1"
                                  groupid])
            uartc (<execute! tx ["UPDATE subtopics SET starticlescount=starticlescount + 1 WHERE stid=$1"
                                 sid])
            uartins (<insert! tx
                              {:table "articles"}
                              {:aurl url :atitle title :asuttopicid sid :acommentcount 0 :alikescount 0 :auid uid})
            ok? (<commit! tx)]
           ok?))

1 个答案:

答案 0 :(得分:2)

我不熟悉postgres.async库,但Exception不是JVM中所有异常的根,Throwable是。

将您的捕获更改为Throwable将是我建议的第一个更改,但似乎(<execute! ...)实际捕获了异常并返回它,因此您需要使用{检查返回值{1}}