繁体   English   中英

try / catch / finally是scala中的表达式吗? 如果是,最终如何以及何时执行?

[英]Is try/catch/finally an expression in scala ? if yes how and when does finally get executed?

我写了一些代码,对此我感到有些惊讶。 我专门使用try / catch / finally只是为了了解它如何在scala中工作。

我很惊讶,但似乎try / catch / finally实际上是scala中的一种表达? 是新的还是我错过了什么? 从某种程度上讲,我可以理解它的功能,但是这些都是语言中的关键字,我看不到定义它们的功能。

同样在该代码中,我不明白为什么最终最终不对返回类型有所贡献。 只有catch and try确实有助于返回类型。 因此,我不确定何时确切执行。

有人可以向我解释或指出该声明的规范,以便我理解。 再次,我知道使用Try类型是定义方法,但我只想了解这里发生的情况。

def createTripleList(msg: String): List[String] = {

  val outStream = new ByteArrayOutputStream

  try {
    val model = ModelFactory.createDefaultModel()
    val jld = model.read(new ByteArrayInputStream(msg.getBytes()), null, "JSON-LD")
    jld.write(outStream, "N-TRIPLE", null)
    model.close()
    outStream.toString.split("\n").toList
  }
  catch {
    case e:Throwable => println(s"Could not parse JsonLd: ${e.toString}"); List.empty[String]
  }
  finally {outStream.close()}
}

取自Scala语言规范

“ try表达式的形式为try {b} catch h”。

“让pt为try表达式的预期类型。期望块b符合pt。处理器h期望符合scala.PartialFunction [scala.Throwable,pt]类型。try表达式的类型为弱b类型的最小上限和h“的结果类型。

“一个try表达式try {b}最终e会对块b求值。如果对b的求值没有引发异常,则对表达式e求值。如果在对e求值的过程中抛出异常,则对try表达式求值被抛出的异常中止。如果在e的求值过程中没有抛出异常,则b的结果作为try表达式的结果返回。

“如果在b的求值过程中引发了异常,则还将对finally块e进行求值。如果在e的求值过程中引发了另一个异常e,则try表达式的求值将被抛出的异常中止。 e,对e的评估完成后,将重新抛出b中引发的原始异常。块b应符合try表达式的预期类型。最终表达式e应符合Unit“类型。

- 来源

TL; DR

无论发生什么情况,都将始终执行finally块 ,并且期望该的类型为Unit这意味着它不会影响表达式的返回类型。
但是, try / catch的返回类型是try块 b的返回类型和异常处理程序 h的返回类型的“最小上限”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM