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

Try, Success, Failure

Обработка исключений

Урок 2 из 413 шагов

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

Что такое Try?

Try[T] представляет вычисление, которое может либо вернуть значение, либо выбросить исключение. У него есть два подтипа:

  • Success[T] содержит обычный результат.
  • Failure содержит Throwable.

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

Импорт Try

Try находится в scala.util. Поместите любое выражение, которое может выбросить исключение, внутрь Try { ... }, и он перехватит за Вас нефатальные исключения.

import scala.util.Try

@main def run(): Unit = {
  val ok = Try(10 / 2)
  val bad = Try(10 / 0)
  println(ok)
  println(bad)
}

Success и Failure

Если Try завершается нормально, он становится Success, содержащим значение; если возникает исключение, он становится Failure, содержащим это исключение.

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

@main def run(): Unit = {
  val result = Try("123".toInt)
  result match {
    case Success(n) => println(s"parsed: $n")
    case Failure(e) => println(s"failed: ${e.getMessage}")
  }
}

Сопоставление с образцом для ошибок

Если обёрнутый код выбрасывает исключение, его можно исследовать внутри Failure. Здесь некорректный разбор обрабатывается аккуратно.

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

@main def run(): Unit = {
  val result = Try("abc".toInt)
  result match {
    case Success(n) => println(s"got $n")
    case Failure(e) => println(s"error type: ${e.getClass.getSimpleName}")
  }
}

getOrElse с Try

getOrElse возвращает успешное значение или значение по умолчанию, если вычисление Try завершилось ошибкой. Это полностью избавляет от необходимости выбрасывать исключения.

import scala.util.Try

@main def run(): Unit = {
  val n = Try("oops".toInt).getOrElse(-1)
  println(n)
}

map для Try

map преобразует значение Success. Если исходное значение — Failure или функция преобразования выбрасывает исключение, результатом также остаётся Failure.

import scala.util.Try

@main def run(): Unit = {
  val doubled = Try("21".toInt).map(_ * 2)
  val failed  = Try("x".toInt).map(_ * 2)
  println(doubled)
  println(failed)
}

recover: обработка исключения

recover позволяет превратить Failure обратно в Success, обработав определённые исключения с помощью частичной функции.

import scala.util.Try

@main def run(): Unit = {
  val safe = Try("x".toInt).recover {
    case _: NumberFormatException => 0
  }
  println(safe)
}

recoverWith

recoverWith похож на recover, но обработчик возвращает другой Try, а не обычное значение. Используйте его, когда восстановление само может завершиться ошибкой.

import scala.util.Try

@main def run(): Unit = {
  val result = Try("x".toInt).recoverWith {
    case _: NumberFormatException => Try("42".toInt)
  }
  println(result)
}

toEither и toOption

Try удобно преобразуется в другие типы для представления ошибок:

  • toOption: Success становится Some, а Failure — None.
  • toEither: Success становится Right, а Failure — Left(throwable).
import scala.util.Try

@main def run(): Unit = {
  println(Try("5".toInt).toOption)
  println(Try("x".toInt).toOption)
  println(Try("5".toInt).toEither.isRight)
}

Построение цепочек с flatMap

flatMap последовательно выполняет вычисления, каждое из которых возвращает Try. Если любой этап завершается ошибкой, вся цепочка немедленно возвращает этот Failure.

import scala.util.Try

object Main {
  def half(n: Int): Try[Int] = Try(if (n % 2 == 0) n / 2 else throw new RuntimeException("odd"))

  def main(args: Array[String]): Unit = {
    println(Try("8".toInt).flatMap(half))
    println(Try("7".toInt).flatMap(half))
  }
}

Try и try/catch

Try превращает исключения в значения, поэтому можно применять map, flatMap и объединять результаты без вложенных блоков try/catch. Он перехватывает только нефатальные исключения; серьёзные ошибки, например OutOfMemoryError, по-прежнему распространяются дальше.

Быстрая проверка

Проверьте свои знания о Try.

Итоги

Вы изучили обработку исключений с помощью Try:

  • Try { ... } сохраняет нефатальные исключения как Failure, а обычные результаты — как Success.
  • Преобразуйте результаты с помощью map/flatMap; восстанавливайтесь после ошибок с помощью recover/recoverWith.
  • Задавайте значения по умолчанию с помощью getOrElse.
  • Преобразуйте результат с помощью toOption и toEither.
Можно начать бесплатно

Изучай Scala с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
39
Уроки
143

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

Урок «Try, Success, Failure» бесплатный?

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

Чему я научусь в уроке «Try, Success, Failure»?

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

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

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

Сколько времени занимает урок «Try, Success, Failure»?

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

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

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

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

  1. Either для ошибок
  2. Try, Success, Failure
  3. Композиция Either
  4. Преобразование между типами
← Назад к Scala for Backend Engineering & Functional Programming