scala中类似的Try块到Try/finally块

scala中类似的Try块到Try/finally块,scala,functional-programming,Scala,Functional Programming,scala的类似方式是什么 timer.start() try { doThis() } finally { timer.cancel() } 假设Try中的异常只会创建一个Failure值(与使用Try时将控制权转移到外部catch块相反),则原始finally块中的代码只需在Try之后执行即可。 换句话说,这样做可以: timer.start() val result = Try{ doThis() } timer.cancel() result 据我所知,没有内置的快捷方式

scala的类似方式是什么

timer.start()
try {
  doThis()
} finally {
  timer.cancel()
}

假设
Try
中的异常只会创建一个
Failure
值(与使用
Try
时将控制权转移到外部catch块相反),则原始
finally
块中的代码只需在
Try
之后执行即可。 换句话说,这样做可以:

timer.start()
val result = Try{
  doThis()
}
timer.cancel()
result

据我所知,没有内置的快捷方式可以避免捕获
结果
,只返回原样。

因为
Try
不会在程序流中引发异常,我相信只需编写以下内容:

timer.start()
Try(doThis())
timer.cancel()
如果希望处理异常(而不是盲目忽略它)或调用结果,可以将
Try(doThis())
赋值并进一步处理它。

Try {
  scala.util.control.Exception.ultimately {
    timer.cancel()
  } {
     doThis()
  }
}

通常,您希望返回
Try
值agreed,在大多数情况下,您希望知道何时抛出异常,并对此进行处理(因此我在响应中的最后一句话),而不是盲目地忽略它(即使这只是确认抛出的异常)。我已经更新了我的答案,使其更加精确。请注意,对于致命错误(如OOM),不会执行“finally”代码,因为致命错误不会被
Try
捕获。但这样的错误应该会使整个应用程序失败。第二个代码块不是等效的
Try.map
只映射
Success
案例,因此如果发生错误,
timer.cancel()
将永远不会被调用。现在这很尴尬,我不知道我是怎么做到这么愚蠢的。假设是因为我今天生病了,忘了吧。感谢您发现这一点。如果您正在使用实现java.lang.AutoCloseable的东西,您可以使用下面答案中的代码来实现标准的“finally”模式。您还可以轻松地重构下面答案中的代码,以将其重新定位到特定的资源API:对最终结果进行一些解释将非常有用