9

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

(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 语句的范围内。

那么处理这个问题的最佳方法是什么?

4

1 回答 1

11

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

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

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

于 2013-12-02T19:09:08.780 回答