如何使用相同的finally块处理let
语句的绑定(bind)或主体中可能发生的异常?前任:
(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绑定(bind)内的finally语句的范围内。那么解决这个问题的最好方法是什么?
最佳答案
内置的with-open
可在您可以调用.close
的任何东西上使用,因此通常的方法是使用类似以下内容的方法:
(with-open [connections (create-connections)]
(do-stuff connections))
并处理在无法打开它们的代码中打开连接的错误。如果create-connections无法打开其中一个连接,则create-connections中的
try
... finally
块可能是处理此类错误情况的更干净的地方。关于exception-handling - 如何处理在let绑定(bind)或主体中发生的异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20335760/