0Pricing
Scala for Backend Engineering & Functional Programming · Урок

Option, Try и Either для обработки ошибок

Реализуйте надёжную обработку ошибок с помощью `Option` для отсутствующих значений, `Try` для исключений и `Either` для раздельных сценариев неудачи и успеха.

«Option, Try и Either для обработки ошибок» — бесплатный урок Scala for Backend Engineering & Functional Programming на CoddyKit. Это урок 3 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Scala for Backend Engineering & Functional Programming, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Scala for Backend Engineering & Functional Programming содержит 3 уроков всего.

Корректная обработка ошибок

В программировании не всегда всё идёт по плану. Файлы могут отсутствовать, сетевые запросы завершаться неудачно, а вычисления приводить к недопустимым результатам.

  • Как писать надёжный код, способный корректно обрабатывать такие ситуации?
  • Scala предоставляет мощные средства для управления ошибками и отсутствующими значениями без повсеместного использования `null` или выбрасывания исключений.

Проблема `null`

Во многих языках null используется для обозначения отсутствия значения. Однако null часто становится источником ошибок, например пресловутого NullPointerException.

Scala не рекомендует использовать null. Вместо этого она предоставляет типы, которые явно указывают, что значение может отсутствовать, благодаря чему код становится безопаснее и понятнее.

Знакомство с Scala Option

Option[A] — это контейнер, который может содержать значение типа A (представленное Some[A]) или вообще не содержать значения (представленное None).

  • Он заставляет учитывать ситуацию, когда значение может отсутствовать.
  • Это предотвращает неожиданные NullPointerExceptions и делает код более явным.

Option в действии: Some и None

Давайте посмотрим, как работает Option. Мы определим функцию, которая может вернуть имя или не вернуть его — в зависимости от ID.

object Main {
  def findUser(id: Int): Option[String] = {
    if (id == 1) Some("Alice")
    else None
  }

  def main(args: Array[String]): Unit = {
    val user1 = findUser(1) // Some("Alice")
    val user2 = findUser(2) // None

    println(s"User 1: $user1")
    println(s"User 2: $user2")
  }
}

Работа с Option: map и getOrElse

С помощью map можно преобразовать значение внутри Option, а с помощью getOrElse — указать значение по умолчанию, если это None.

object Main {
  def findUser(id: Int): Option[String] = {
    if (id == 1) Some("Alice")
    else None
  }

  def main(args: Array[String]): Unit = {
    val userGreeting = findUser(1).map(name => s"Hello, $name!")
    val defaultGreeting = findUser(2).map(name => s"Hello, $name!").getOrElse("Hello, Guest!")

    println(s"User greeting: $userGreeting")
    println(s"Default greeting: $defaultGreeting")
  }
}

Знакомство со Scala Try

Если Option обрабатывает отсутствующие значения, то Try[A] предназначен для обработки вычислений, которые могут выбросить исключение.

  • Try может быть либо Success[A] (если вычисление завершилось нормально), либо Failure[Throwable] (если произошло исключение).
  • Он инкапсулирует исключения и позволяет обрабатывать их функциональным способом.

Try в действии: Success и Failure

Давайте определим функцию, которая может выбросить исключение (например, при делении на ноль), и обернём её выполнение в Try.

import scala.util.{Try, Success, Failure}

object Main {
  def divide(a: Int, b: Int): Try[Int] = Try {
    a / b
  }

  def main(args: Array[String]): Unit = {
    val result1 = divide(10, 2) // Success(5)
    val result2 = divide(10, 0) // Failure(java.lang.ArithmeticException: / by zero)

    println(s"Result 1: $result1")
    println(s"Result 2: $result2")
  }
}

Работа с Try: recover и fold

Try предоставляет такие методы, как recover для обработки определённых исключений и fold для удобной обработки как успешных, так и неуспешных случаев.

import scala.util.{Try, Success, Failure}

object Main {
  def parseNumber(s: String): Try[Int] = Try(s.toInt)

  def main(args: Array[String]): Unit = {
    val num1 = parseNumber("123").getOrElse(0)
    val num2 = parseNumber("abc").getOrElse(0)

    val message = parseNumber("456").fold(
      ex => s"Failed to parse: ${ex.getMessage}",
      num => s"Parsed number: $num"
    )

    println(s"Parsed num1: $num1")
    println(s"Parsed num2: $num2")
    println(s"Message: $message")
  }
}

Знакомство со Scala Either

Either[L, R] — это тип, представляющий одно из двух возможных значений. По соглашению:

  • Left[L] представляет неудачу (или тип ошибки L).
  • Right[R] представляет успех (или тип результата R).

В отличие от Try, Either позволяет указать содержательный тип ошибки, а не только Throwable.

Either в действии: Left и Right

Вот функция, которая проверяет адрес электронной почты. Она возвращает либо сообщение об ошибке типа String (Left), либо проверенный адрес электронной почты (Right).

object Main {
  def validateEmail(email: String): Either[String, String] = {
    if (email.contains("@") && email.contains(".")) Right(email)
    else Left("Invalid email format")
  }

  def main(args: Array[String]): Unit = {
    val email1 = validateEmail("test@example.com") // Right("test@example.com")
    val email2 = validateEmail("invalid-email")   // Left("Invalid email format")

    println(s"Email 1: $email1")
    println(s"Email 2: $email2")
  }
}

Быстрая проверка: обработка ошибок

Вы пишете функцию, которая считывает значение конфигурации из отображения. Если ключ существует, нужно преобразовать его строковое значение в целое число. Если ключ отсутствует или преобразование завершается неудачно, нужно вернуть значение по умолчанию 0.

Какая комбинация типов и методов Scala лучше всего подходит для этой задачи?

Итоги: Option, Try и Either

Мы рассмотрели три мощных типа Scala для надёжной обработки ошибок:

  • Option[A]: для обработки отсутствия значения (Some[A] или None).
  • Try[A]: для инкапсуляции вычислений, которые могут выбросить исключения (Success[A] или Failure[Throwable]).
  • Either[L, R]: для представления двух различных исходов, обычно типа ошибки L и типа успешного результата R (Left[L] или Right[R]).

Использование этих типов делает код на Scala безопаснее, явнее и более функциональным!

Часто задаваемые вопросы

Урок «Option, Try и Either для обработки ошибок» бесплатный?

Да — полный текст урока «Option, Try и Either для обработки ошибок» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Scala for Backend Engineering & Functional Programming, подпишись на CoddyKit PRO. Курс Scala for Backend Engineering & Functional Programming содержит 3 уроков всего.

Чему я научусь в уроке «Option, Try и Either для обработки ошибок»?

Реализуйте надёжную обработку ошибок с помощью `Option` для отсутствующих значений, `Try` для исключений и `Either` для раздельных сценариев неудачи и успеха. Ты практикуешь Scala for Backend Engineering & Functional Programming с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Scala for Backend Engineering & Functional Programming?

Предыдущий опыт не требуется. Scala for Backend Engineering & Functional Programming на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 3.

Сколько времени занимает урок «Option, Try и Either для обработки ошибок»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Scala for Backend Engineering & Functional Programming?

Да. Каждый урок Scala for Backend Engineering & Functional Programming включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Глубокое изучение неизменяемых коллекций
  2. Функциональные операции над коллекциями
  3. Option, Try и Either для обработки ошибок
← Назад к Scala for Backend Engineering & Functional Programming