Exception handling 如何处理let绑定或正文中出现的异常

Exception handling 如何处理let绑定或正文中出现的异常,exception-handling,clojure,autocloseable,Exception Handling,Clojure,Autocloseable,如何使用相同的finally块处理let语句的绑定或主体中可能出现的异常?例: (let [connections (create-connections)] (dostuff) (close connections)) 如果(创建连接)或(dostuff)失败,我想(关闭连接)。一些选择: 备选案文1: (try (let [connections (create-connections)] (dostuff)) (finally (close conn

如何使用相同的finally块处理
let
语句的绑定或主体中可能出现的异常?例:

(let [connections (create-connections)] 
  (dostuff)
  (close connections))
如果
(创建连接)
(dostuff)
失败,我想
(关闭连接)
。一些选择:

备选案文1:

(try     
  (let [connections (create-connections)] 
    (dostuff))
  (finally (close connections))
但这显然不起作用,因为
连接
不在finally块的范围内

备选案文2:

(let [connections (create-connections)]
  (try
    (dostuff)
    (finally (close connections)))
此选项仅捕获在
(destuff)
调用中发生的异常,而不捕获在
(创建连接)
中发生的异常

备选案文3:

(let [connections (try 
                    (create-connections)
                    (finally (close connections)))]
  (try
    (dostuff)
    (finally (close connections)))
这也不起作用,因为连接不在let绑定中finally语句的范围内


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

内置的带有open的
可以在任何你可以调用的
上工作。close
打开,所以通常的方法是使用如下内容:

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

并处理在未能打开连接的代码中打开连接时出现的错误。如果创建连接无法打开其中一个连接,则可能需要
尝试
<代码>最后
create connections中的block是处理此类错误情况的一个更干净的地方。

我认为您在create connections中处理连接打开故障是正确的。创建连接时发生的故障实际上与执行操作时发生的故障是分开的,因此处理可以是分开的。打得好。不幸的是,你接受了这个答案,因为它没有解决你提出的更一般的问题,而只解决了你给出的具体例子。你怎么可能建立起你未能建立的密切联系?这根本没有意义。这里有一个有趣的讨论:-特别是这个评论: