如何处理let绑定或正文中发生的异常

时间:2013-12-02 18:58:33

标签: exception-handling clojure autocloseable

如何处理使用相同finally块的let语句的绑定或正文中可能发生的异常?例如:

(let [connections (create-connections)] 
  (dostuff)
  (close connections))

如果(create-connections)(dostuff)失败,我想(close connections)。一些选择:

选项1:

(try     
  (let [connections (create-connections)] 
    (dostuff))
  (finally (close connections))

这显然不起作用,因为connections不在finally块的范围内。

选项2:

(let [connections (create-connections)]
  (try
    (dostuff)
    (finally (close connections)))

此选项仅捕获(destuff)来电中出现的异常,而不是(create-connections)中出现的异常。

选项3:

(let [connections (try 
                    (create-connections)
                    (finally (close connections)))]
  (try
    (dostuff)
    (finally (close connections)))

这也不起作用,因为connections不在let绑定中的finally语句的范围内。

那么解决这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:11)

内置with-open适用于您可以调用.close的任何内容,因此通常的方法是使用以下内容:

(with-open [connections (create-connections)] 
    (do-stuff connections))

并处理在无法打开它们的代码中打开连接的错误。如果create-connections无法打开其中一个连接,那么创建连接中的try ... finally块可能是处理这种错误情况的更清洁的地方。