ControlThrowableをcatchしてみる

scala

try { f() } catch {
  case e: Throwable => println(e)
}

など書いてしまうとどうなるかは以下の記事に解説があります。

Scala 2.10 から try catch の catch の部分に型を書かないと警告が出るようになった件について - scalaとか・・・

ほへーと思いながら日々過ごしていたらうっかり書いてしまいました...(◞‸◟) 自戒の意味を込めて制御用のThrowableであるControlThrowableを実際にcatchしてみたいとおもいます。

ControlThrowableはラムダ式内でreturnするとラムダ式を飛び越えて、メソッドから出るという動作のために投げられている例外です。 ということで以下のようにラムダ式内でわざとreturnしてみましょう。

import scala.util.control.NonFatal

object Main {
  def main (args: Array[String]) {
    val xs = 1 to 10

    val filtered = try {
      xs.filter { x =>
        if (x < 5) return false

        if (x * 3 + 4 < 20) true
        else false
      }
    } catch {
      case e: Throwable => {
        println(e)
        xs
      }
    }
    println(filtered)
  }
}

Main.main(Array())
$ scala Main.scala
scala.runtime.NonLocalReturnControl$mcV$sp
Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

ということで無事に(?) NonLocalReturnControl をcatchできました。

以上です気をつけましょう。