Scalaの例外処理は、Javaなどの他の言語に似てます。
Scalaのメソッドは、返す値を渡さないで、例外をスローして関連するコードの実行を終了できます。
例外をスローする
Scalaは、Javaと同じメソッド(throwメソッド)で例外をスローします。例えば、次のように新しいパラメータ例外をスローします。
throw new IllegalArgumentException
例外をキャッチする
例外をキャッチするメカニズムは他の言語と同じです。例外が発生すると、catch文が順番にキャッチします。そのため、catch文では、より具体的な例外が前面に配置され、より一般的な例外が後ろに配置されます。スローされた例外がcatch文にない場合、例外を処理できず、呼び出し元にエスカレーションされます。
例外をキャッチするcatch文の構文は、他の言語の構文と異なります。 Scalaでは、パターンマッチングのように例外のマッチングを行います。そのため、catchのコードには一連のcase文です。次の例をご覧ください。
実例
import java.io.FileReader
import java.io.FileNotFoundException
import java.io.IOException
object Test {
def main(args: Array[String]) {
try {
val f = new FileReader("input.txt")
} catch {
case ex: FileNotFoundException =>{
println("Missing file exception")
}
case ex: IOException => {
println("IO Exception")
}
}
}
}
上記のコードを実行した出力結果は次となります。
$ scalac Test.scala
$ scala Test
Missing file exception
catch文の内容は、matchにあるcaseト全く同じです。 例外キャッチが順番に行われているため、最も一般的な例外であるThrowableが先頭に記述されている場合、その後のcaseはキャッチされないため、それを最後に記述する必要があります。
finallyステートメント
finallyステートメントは、例外が発生するかどうかに関係なく、実行する必要のあるステップに使用されます。次の例をご覧ください。
実例
import java.io.FileReader
import java.io.FileNotFoundException
import java.io.IOException
object Test {
def main(args: Array[String]) {
try {
val f = new FileReader("input.txt")
} catch {
case ex: FileNotFoundException => {
println("Missing file exception")
}
case ex: IOException => {
println("IO Exception")
}
} finally {
println("Exiting finally...")
}
}
}
上記のコードを実行した出力結果は次となります。
$ scalac Test.scala
$ scala Test
Missing file exception
Exiting finally...
コメントを残す