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できました。
以上です気をつけましょう。