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

先日、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というわけで、このあたりを理解して書き換えましょう

*1:非公式とは、ディストリビューションはまだ公式サイトから配布していないが、jarはmaven centralリポジトリにあがっているという意味。sbtやmavenやgradleなどでversionを指定してとってくれば、すでに使える。

*2:この警告について、他にも意図があったり、自分が書いたこと間違っていたら教えて下さい