如何处理使用相同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语句的范围内。
那么解决这个问题的最佳方法是什么?
答案 0 :(得分:11)
内置with-open
适用于您可以调用.close
的任何内容,因此通常的方法是使用以下内容:
(with-open [connections (create-connections)]
(do-stuff connections))
并处理在无法打开它们的代码中打开连接的错误。如果create-connections无法打开其中一个连接,那么创建连接中的try
... finally
块可能是处理这种错误情况的更清洁的地方。