例外
java によく似た形式だが、Scala は非チェック例外なので throws でチェックする例外を
宣言する必要がないしコンパイルエラーを消すために無理に try catch を記述する必要もない。
(@throwsアノテーションを使えば、throws宣言は可能)
また、java の throws で例外宣言しているメソッドを Scala から呼び出しても
try catch で例外を捕捉しなくても良い。
scala の catch ブロックでは、捕捉する例外をバターンマッチ形式で case の後に指定する。
例外後の処理は => の後に記述する。
そして、Scala の try catch finally は結果の値を生成する。
scala> val foo = try { | "test".toLong | } catch { | case ex: Exception => 2L | } finally { | 3L | } foo: Long = 2 scala> val bar = try { | "4".toInt | } catch { | case ex: Exception => 2 | } finally { | 3 | } bar: Int = 4
実際は、finally の結果値ではなく、try か catch の結果値が返される。
関数内で finally の結果値を return で返すようにすると finally の結果値 3 が返される。
しかし、実際のプログラムでは、try の値や catch の値が finally の値で書き換わるので
finally で値を返すのは止めた方が良い。
scala> def foobar(): Int = try { 1 } finally { return 3 } foobar: ()Int scala> foobar res0: Int = 3
例外の throw も java と同じ形式
scala> def func(n: Int) = if (n >= 2 && n % 2 == 0) n / 2 else throw new RuntimeException func: (n: Int)Int scala> func(4) res1: Int = 2 scala> func(0) java.lang.RuntimeException at .func(<console>:7) ..snip..