Try, Success, Failure
Обработка исключений
«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 — локальная установка не требуется.
Все уроки этого курса
- Either для ошибок
- Try, Success, Failure
- Композиция Either
- Преобразование между типами