あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

例外

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..