【问题标题】:Finally equivalent in Scala Try [duplicate]Scala中的最终等效尝试[重复]
【发布时间】: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


【解决方案1】:

只是暂时将Try 松鼠:

def doWork = {
  getLock()
  val t = Try(useResource)
  releaseLock()
  t.get
}

【讨论】:

    猜你喜欢
    • 2015-01-17
    • 1970-01-01
    • 2013-11-17
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2017-11-05
    • 2016-01-10
    相关资源
    最近更新 更多