Scala-Ausnahmebehandlung

Scalas Ausnahmebehandlung ähnelt der anderer Sprachen wie Java.

Scala-Methoden können die Ausführung des relevanten Codes durch das Auslösen einer Ausnahme beenden, anstatt einen Wert zurückgeben zu müssen.


Ausnahmen werfen

Scala löst Ausnahmen auf dieselbe Weise wie Java aus, und zwar mithilfe der throw-Methode. Zum Beispiel das Auslösen einer neuen IllegalArgumentException:

throw new IllegalArgumentException

Ausnahmen abfangen

Der Mechanismus zum Abfangen von Ausnahmen ist derselbe wie in anderen Sprachen. Wenn eine Ausnahme auftritt, werden catch-Klauseln in der Reihenfolge abgefangen. Daher sollten in catch-Klauseln die spezifischeren Ausnahmen zuerst kommen und die allgemeineren Ausnahmen später. Wenn die ausgelöste Ausnahme nicht in einer catch-Klausel enthalten ist, kann die Ausnahme nicht behandelt werden und wird an den Aufrufer weitergegeben.

Die Syntax der catch-Klausel zum Abfangen von Ausnahmen unterscheidet sich etwas von anderen Sprachen. In Scala wird die Idee des Musterabgleichs für den Ausnahmeabgleich übernommen. Daher gibt es im catch-Code eine Reihe von case-Klauseln, wie im folgenden Beispiel gezeigt:

Beispiel

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

Führe den obigen Code aus, das Ausgabeergebnis ist:

$ scalac Test.scala 
$ scala Test
Missing file exception

Der Inhalt im catch-Block ist genau derselbe wie der case in match. Da das Abfangen von Ausnahmen sequenziell erfolgt, wird, wenn die allgemeinste Ausnahme, Throwable, zuerst geschrieben wird, die darauffolgenden Fälle nicht abgefangen, daher muss sie zuletzt geschrieben werden.


finally-Anweisung

Die finally-Anweisung wird verwendet, um Schritte auszuführen, die unabhängig davon ausgeführt werden müssen, ob die Verarbeitung normal abläuft oder eine Ausnahme auftritt. Ein Beispiel ist wie folgt:

Beispiel

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

Führe den obigen Code aus, das Ausgabeergebnis ist:

$ scalac Test.scala 
$ scala Test
Missing file exception
Exiting finally...
Andere Erweiterungen