如何捕获并重新抛出异常

8

我有一个Clojure函数,它调用另一个函数来更新数据库。

(^{PUT true
       Path "/{id}"
       Produces ["application/json"]
       Consumes ["application/json"]
       ApiOperation {:value "Update" :notes ""}}
       updateFeedback [this
                       ^{PathParam "id"} id
                       body]
       (require 'com.xx.x.xx.xx.xx-response)
       (let [doc (json/read-json body)]
         (if-let [valid-doc (validate doc)]
                 (try+
                  (->>
                   (assoc valid-doc :modificationDate (Utilities/getCurrentDate))
                   (couch/update-document dbs/xx-db)
                   (core/ok-response))
                  (catch java.io.IOException ex
                         (log/error "line num 197"))
                  (catch java.lang.Exception ex
                         (log/error "line num 200"))))))

更新文档功能会抛出异常。我想将其抛回给调用者——在这种情况下是updateFeedback,以便执行catch块中的内容。但出于某种原因,Clojure记录了异常,而调用者中的catch块从未执行。
为了验证,我在update-document函数中添加了try catch块。那里的catch块得到了执行。
如何向函数添加throws子句?
更新:我已经更新了函数。对于语法问题表示歉意。我们正在使用的代码是继承而来的,我们被要求修复一个bug。任何指针都将非常有帮助。

2
"do-stuff" 不是一个有效的函数 - 您缺少参数声明,并且括号不匹配。 - bsvingen
你的“some-function”很可能不会抛出异常。如果它确实抛出了异常,那么catch块将按照您的期望执行。检查一下你的“some-function”。你能在repl中执行它吗?它返回什么? - Viktor K.
我重新格式化了这个例子,没有改变任何意思,并且更改了标题以更好地匹配问题。 - Arthur Ulfeldt
1个回答

13

如果您想捕获并重新抛出异常,可以像这样操作:

(defn throwing-function
  []
  (/ 7 0))

(defn catching-function
  []
  (try
    (throwing-function)
    (catch Exception e
      (println "Caught exception:" e)
      (println "Re-throwing ...")
      (throw e))))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接