Появился в Scala 2.10.0 и был портирован в Scala 2.9.3.
Как и в других языках Scala позволяет производить выбрасывание исключений:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
case class Customer(age: Int) class Cigarettes case class UnderAgeException(message: String) extends Exception(message) def buyCigarettes(customer: Customer): Cigarettes = if (customer.age < 16) throw UnderAgeException(s"Customer must be older than 16 but was ${customer.age}") else new Cigarettes |
Выброшенные исключения могут быть отловлены и обработаны с помощью блоков Try/Catch содержащих частично применяемые функции, которые указывают на типы, исключений, которые мы хотим обработать. Кроме того, в scala блок Try/Catch – это выражение которое может иметь результат.
Например, так:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
val youngCustomer = Customer(15) try { buyCigarettes(youngCustomer) "Yo, here are your cancer sticks! Happy smokin'!" } catch { case UnderAgeException(msg) => msg } |
Обработка ошибок функциональным способом
Обработка ошибок классическим способом плохо сочетается с функциональным программированием, такой подход также очень плохо сочетается с параллелизмом. Например, в системе Акторов, если исключение происходит в другом акторе, то это означает, что Вы не можете поймать это исключение, так как оно находиться в другом потоке выполнения, но информация об ошибке не должна теряться.
Для решения таких задач в Scala предусмотрена возможность возвращать значение соответствующе ошибке из функций. Это достигается применением типа Try включенного в состав Scala. Кроме того, существует более обобщенный тип Either.