【问题标题】:Is try/catch/finally an expression in scala ? if yes how and when does finally get executed?try/catch/finally 是 scala 中的表达式吗?如果是,最终如何以及何时执行?
【发布时间】:2019-06-20 02:55:43
【问题描述】:

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

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

此外,在该代码中,我不明白为什么 finally 对返回类型没有贡献。只有 catch 和 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


    【解决方案1】:

    取自 Scala 语言规范

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

    "设 pt 为 try 表达式的预期类型。块 b 应符合 pt。处理程序 h 应符合 scala.PartialFunction[scala.Throwable, pt] 类型。try 表达式的类型是 b 的类型和 h 的结果类型的弱最小上界"。

    "try 表达式 try { b } finally e 对块 b 求值。如果对 b 的求值没有导致抛出异常,则对表达式 e 求值。如果在求值 e 期间抛出异常,则求值try 表达式因抛出异常而中止。如果在 e 的求值过程中没有抛出异常,则 b 的结果作为 try 表达式的结果返回。

    "如果在b的求值过程中抛出异常,finally块e也被求值。如果在e的求值过程中抛出另一个异常e,则try表达式的求值被抛出异常中止。如果没有抛出异常在对 e 求值期间,一旦对 e 求值完成,就会重新抛出在 b 中抛出的原始异常。块 b 应符合 try 表达式的预期类型。final 表达式 e 应符合 Unit 类型" .

    -- Source.

    TL;博士

    无论发生什么,finally 块总是会被执行,并且它的类型应该是Unit——这意味着它不会影响表达式的返回类型。
    但是,try / catch 的返回类型是 try 块 b 的返回类型和 “弱最小上限” strong>异常处理程序 h.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      相关资源
      最近更新 更多