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

معالجة الاستثناءات ل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")
      }
         case ex: FileNotFoundException => {
            println("استثناء فقدان الملف")
         {}
         case ex: IOException => {
            println("استثناء استثناء الدخول الخارجي")
         {}
      {}
   {}
{}

إذا قمت بتشغيل الكود أعلاه، النتيجة ستكون:

$ scalac Test.scala 
$ scala Test
استثناء فقدان الملف

المحتوى في جملة catch هي نفسه تمامًا مثل case في 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")
      }
         case ex: FileNotFoundException => {
            println("استثناء فقدان الملف")
         {}
         case ex: IOException => {
            println("استثناء استثناء الدخول الخارجي")
         {}
      }
         println("إخراجُ النهايةُ")
      {}
   {}
{}

إذا قمت بتشغيل الكود أعلاه، النتيجة ستكون:

$ scalac Test.scala 
$ scala Test
استثناء فقدان الملف
إخراجُ النهايةُ