先日、12月20日に、(現時点では非公式ですが)Scala 2.10.0がでました。*1
ところで、2.10から以下のような警告がでます。
scala> try{ | 1 | } catch { | case e => e.printStackTrace | } <console>:11: warning: This catches all Throwables. If this is really intended, use `case e : Throwable` to clear this warning. case e => e.printStackTrace ^
で、2.8から2.9でerrorの呼び出しが警告になって、sys.errorになったときなども、単純作業で置き換えなくてはならず、ちょっと評判悪かったのですが・・・なにも知らずに単にThrowableの型を書くのはまずいというか、それを助長するようなこの警告文の内容ちょっとだけまずいというか、言葉足りないのではないかという話。この警告がでる意図というのは、(今まで型省略するとThrowableでcatchって意味だったけど)お前ほんとにThrowableでcatchしたいの?え?Throwableだよ?ThrowableってThrowableだよ?全部だよ?という話ですが、往々にして以下のように書いたほうがいい場合もあるって話です
scala> import scala.util.control.NonFatal import scala.util.control.NonFatal scala> try{ | 1 | } catch { | case NonFatal(e) => e.printStackTrace | }
https://github.com/scala/scala/blob/v2.10.0/src/library/scala/util/control/NonFatal.scala#L31-L39
つまり、(breakやラムダ内からのreturnを実現するための制御構造としての) ControlThrowable やOutOfMemoryErrorなどを含む VirtualMachineError までcatchして本当にいいのか?本当にお前がそんなものまでcatchしたいなら、明示的に e: Throwable って書け!という話のはずです。*2というわけで、このあたりを理解して書き換えましょう