如何使用相同的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/

10-10 01:04