【发布时间】:2015-11-12 22:21:51
【问题描述】:
def doWork() = {
getLock()
Try(useResource) match {
case Success(result) => releaseLock(); result
case Failure(e: Exception) => releaseLock(); throw e
}
}
我试图惯用地确保在我退出 doWork 时释放锁。但是,作为该方法的一部分,我可能会抛出异常,所以我不能只在doWork 末尾释放锁。
releaseLock() 重复两次看起来有点代码味道。我可以通过使用传统的 Java 风格的 try/catch/finally 来减少它:
def doWork() = {
getLock()
try {
useResource
} catch {
case e: Exception => throw e
} finally {
releaseLock()
}
}
但如果可能,我更喜欢使用 Scala 的 Try。
有没有办法在Try 的框架内执行“最终”逻辑?
【问题讨论】:
-
你的两个版本不一样。第二个返回
useResource的结果;第一个丢弃该值并返回releaseLock的结果。 -
-
如果您使用的东西实现了 java.lang.AutoCloseable,您可以使用下面答案中的代码来实现标准的“finally”模式。您还可以轻松地重构以下答案中的代码,以将其重新定位到您的特定资源 API:stackoverflow.com/questions/4604237/…
-
这个问题/答案比重复的要好得多。
标签: scala