【问题标题】:Scala: Can't catch exception thrown inside a closureScala:无法捕获闭包内抛出的异常
【发布时间】:2011-02-09 01:36:33
【问题描述】:

免责声明:Scala 的绝对新手 :(

我定义了以下内容:

def tryAndReport(body: Unit) : Unit = {
  try {
    body
  } catch {
    case e: MySpecificException => doSomethingUseful
  }
}

我这样称呼它:

tryAndReport{
  someCodeThatThrowsMySpecificException()
}

虽然对 someCodeThatThrowsMySpecificException 的调用发生得很好,但 tryAndReport 中没有捕获到异常。

为什么?

谢谢!

【问题讨论】:

    标签: exception scala closures


    【解决方案1】:

    尝试将正文从 Unit 更改为 => Unit。它现在定义的方式,它认为body 是一个代码块来评估Unit。使用按名称调用,它将按照定义在try 中执行,并且应该被捕获。

    【讨论】:

      【解决方案2】:

      tryAndReport 方法中的 body 不是闭包或块,它是一个值(Unit 类型)。

      我不建议使用按名称参数,而是使用显式函数。

      def tryAndReport(block: () => Unit): Unit = {
        try { block() }
        catch { case e: MSE => dSU }
      }
      

      【讨论】:

      • 我不建议使用按名称参数,而是使用显式函数。 -- 为什么?
      • 我同意这一点,你不应该在没有理由的情况下给出这样的建议。
      • 因为我相信你的意思。您希望在 tryAndReport 的主体内评估函数,该函数不应隐藏在按名称参数后面。
      猜你喜欢
      • 2016-10-27
      • 2021-09-02
      • 2011-04-05
      • 2015-09-23
      • 2013-08-02
      • 2018-05-30
      • 1970-01-01
      • 2019-01-14
      • 1970-01-01
      相关资源
      最近更新 更多