Scala の例外処理


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 の場合と全く同じです。例外は順番にキャッチされるため、最も一般的な例外である Throwable を最初に記述すると、それ以降のケースはキャッチされないため、最後に記述する必要があります。


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...")
      }
   }
}

上記のコードを実行すると、出力結果は次のようになります。

りー