【问题标题】:How to handle exceptions that occur in let bindings or body如何处理 let 绑定或正文中发生的异常
【发布时间】:2013-12-18 14:26:24
【问题描述】:

如何使用相同的 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 语句的范围内。

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

【问题讨论】:

标签: exception-handling clojure autocloseable


【解决方案1】:

内置的with-open 适用于任何你可以调用.close 的东西,所以通常的方法是使用类似的东西:

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

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

【讨论】:

  • 我认为您在创建连接中处理连接打开失败是正确的。创建连接时的故障实际上是​​与做事时发生的故障分开的问题,因此处理可以分开。好电话。
  • 很遗憾你接受了这个答案,因为它没有解决你提出的更普遍的问题,而只是你给出的具体例子。
猜你喜欢
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 2013-08-13
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多