English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Scala 异常处理

Le traitement des exceptions en Scala est similaire à celui d'autres langages comme Java.

Les méthodes en Scala peuvent arrêter l'exécution du code pertinent en lançant une exception, sans avoir besoin de retourner une valeur.

Lancer une exception

La méthode de lancement d'exception en Scala est la même que celle de Java, utilisant la méthode throw, par exemple, lancement d'une nouvelle exception de paramètre :

throw new IllegalArgumentException

Capturez l'exception

Le mécanisme de capture des exceptions est le même que dans d'autres langages. Si une exception se produit, la clause catch est capturée par ordre. Par conséquent, dans la clause catch, plus l'exception est spécifique, plus elle doit être placée en premier, et plus l'exception est générale, plus elle doit être placée en dernier. Si l'exception lancée n'est pas dans la clause catch, cette exception ne peut pas être traitée et sera élevée au niveau de l'appelant.

La clause catch pour la capture d'exceptions est légèrement différente dans d'autres langages. En Scala, l'idée de correspondance de modèle est utilisée pour la correspondance des exceptions, donc, dans le code de catch, il s'agit d'une série de clauses case, comme dans l'exemple suivant :

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