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("Missing file exception")
         }
         case ex: IOException => {
            println("IO Exception")
         }
      }
   }
}

Выполните следующий код, результат вывода будет:

$ scalac Test.scala 
$ scala Test
Missing file exception

Содержимое предложения catch полностью совпадает с case в match. Поскольку перехват исключений выполняется по порядку, если наиболее общее исключение, 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")
         }
      }
         println("Exiting finally...")
      }
   }
}

Выполните следующий код, результат вывода будет:

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