Spec-Zone.ru › Scala 3.1

Класс scala.util.Try

Объект-компаньон • Исходный код

sealed abstract class Try[+T] extends Product with Serializable

Тип Try представляет вычисление, которое может либо завершиться исключением, либо вернуть успешно вычисленное значение. Он похож на, но семантически отличается от типа scala.util.Either.

Экземпляры Try[T], являются либо экземпляром scala.util.Success[T], либо scala.util.Failure[T].

Например, Try можно использовать для выполнения деления на пользовательский ввод, без необходимости явного обработки исключений во всех местах, где может произойти исключение.

Пример:

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

def divide: Try[Int] = {
  val dividend = Try(StdIn.readLine("Enter an Int that you'd like to divide:\n").toInt)
  val divisor = Try(StdIn.readLine("Enter an Int that you'd like to divide by:\n").toInt)
  val problem = dividend.flatMap(x => divisor.map(y => x/y))
  problem match {
    case Success(v) =>
      println("Result of " + dividend.get + "/"+ divisor.get +" is: " + v)
      Success(v)
    case Failure(e) =>
      println("You must've divided by zero or entered something that's not an Int. Try again!")
      println("Info from the exception: " + e.getMessage)
      divide
  }
}

Важным свойством Try в приведённом выше примере является его способность к конвейеризации или цепочке операций, перехватывая исключения по мере их возникновения. Комбинаторы flatMap и map в приведённом выше примере по сути передают либо успешно завершённое значение, упакованное в тип Success для дальнейшей обработки следующим комбинатором в цепочке, либо исключение, упакованное в тип Failure обычно для простого его передачи по цепочке. Комбинаторы, такие как recover и recoverWith, предназначены для предоставления некоторого значения по умолчанию в случае ошибки.

Примечание: только некритические исключения перехватываются комбинаторами в Try (см. scala.util.control.NonFatal). Серьёзные системные ошибки, с другой стороны, будут выброшены.

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

Try попал в стандартную библиотеку Scala после многолетнего использования как неотъемлемой части стека Twitter.

Наследники
интерфейс Serializable
интерфейс Product
интерфейс Equals
класс Object
интерфейс Matchable
класс Any
Известные подтипы
класс Failure[T]
класс Success[T]

Классы

Исходный код
final class WithFilter(p: T => Boolean)

Нам нужен целый класс WithFilter, чтобы соблюсти контракт «не создаёт новую коллекцию», хотя в коллекции с максимальным размером 1 это, похоже, вряд ли будет иметь значение.

Абстрактные методы

Исходный код
def collect[U](pf: PartialFunction[T, U]): Try[U]

Применяет заданную частичную функцию к значению из этого Success или возвращает это значение, если это Failure.

Исходный код
def failed: Try[Throwable]

Инвертирует этот Try. Если это Failure, возвращает его исключение, упакованное в Success. Если это Success, возвращает Failure, содержащую UnsupportedOperationException.

Исходный код
def filter(p: T => Boolean): Try[T]

Преобразует это в Failure, если предикат не выполнен.

Исходный код
def flatMap[U](f: T => Try[U]): Try[U]

Возвращает заданную функцию, применённую к значению из этого Success или возвращает это значение, если это Failure.

Исходный код
def flatten[U](implicit ev: T <:< Try[U]): Try[U]

Преобразует вложенный Try, т.е. Try типа Try[Try[T]], в неуложенный Try, т.е. Try типа Try[T].

Исходный код
def fold[U](fa: Throwable => U, fb: T => U): U

Применяет fa, если это Failure, или fb, если это Success. Если fb изначально применяется и выбросит исключение, то fa применяется с этим исключением.

Параметры значения
fa

функция, которая применяется, если это Failure

fb

функция, которая применяется, если это Success

Возвращает

результаты применения функции

Пример
val result: Try[Int] = Try { string.toInt }
log(result.fold(
 ex => "Operation failed with " + ex,
 v => "Operation produced value: " + v
))

Исходный код
def foreach[U](f: T => U): Unit

Применяет заданную функцию f если это Success, в противном случае возвращает Unit, если это Failure.

Примечание: Если f выбросит исключение, то этот метод может выбросить исключение.

Исходный код
def get: T

Возвращает значение из этого Success или выбрасывает исключение, если это Failure.

Исходный код
def getOrElse[U >: T](default: => U): U

Возвращает значение из этого Success или заданный аргумент default, если это Failure.

Примечание:: Это выбросит исключение, если это не успех, а default выбросит исключение.

Исходный код
def isFailure: Boolean

Возвращает true, если Try является Failure, false в противном случае.

Исходный код
def isSuccess: Boolean

Возвращает true, если Try является Success, false в противном случае.

Исходный код
def map[U](f: T => U): Try[U]

Применяет заданную функцию к значению из этого Success или возвращает это значение, если это Failure.

Исходный код
def orElse[U >: T](default: => Try[U]): Try[U]

Возвращает этот Try если это Success или заданный аргумент default если это Failure.

Исходный код
def recover[U >: T](pf: PartialFunction[Throwable, U]): Try[U]

Применяет заданную функцию f если это Failure, в противном случае возвращает это значение, если это Success. Это как map для исключения.

Исходный код
def recoverWith[U >: T](pf: PartialFunction[Throwable, Try[U]]): Try[U]

Применяет заданную функцию f если это Failure, в противном случае возвращает это значение, если это Success. Это как flatMap для исключения.

Исходный код
def toEither: Either[Throwable, T]

Возвращает Left с Throwable, если это Failure, в противном случае возвращает Right со значением Success.

Исходный код
def toOption: Option[T]

Возвращает None если это Failure или Some содержащее значение, если это Success.

Исходный код
def transform[U](s: T => Try[U], f: Throwable => Try[U]): Try[U]

Завершает эту Try путём применения функции f к этому значению, если оно имеет тип Failure, или, наоборот, путём применения s если это Success.

Конкретные методы

Исходный код@inline
final def withFilter(p: T => Boolean): WithFilter

Создаёт нестрогий фильтр, который в конечном итоге преобразует это в Failure если предикат не удовлетворён.

Примечание: в отличие от filter, withFilter не создаёт новую Try. Вместо этого он ограничивает область применения последующих map, flatMap, foreach, и withFilter операций.

Поскольку Try является коллекцией из одного элемента, это может быть немного излишне, но это согласуется с withFilter для Option и другими коллекциями.

Параметры
p

предикат, используемый для проверки элементов.

Возвращает

объект класса WithFilter, который поддерживает map, flatMap, foreach, и withFilter операции. Все эти операции применяются к тем элементам этого Try, которые удовлетворяют предикату p.

Наследованные методы

Исходный код
def canEqual(that: Any): Boolean

Метод, который должен вызываться из каждого хорошо спроектированного метода equals, который может быть переопределён в подклассе. См. Programming in Scala, глава 28 для обсуждения и проектирования.

Параметры
that

значение, которое проверяется на возможное равенство

Возвращает

true, если эта инстанция может быть равна that, в противном случае false

Унаследовано от Equals

Исходный код
def productArity: Int

Размер этого продукта.

Возвращает

для продукта A(x1, ..., xk), возвращает k

Унаследовано от Product

Исходный код
def productElement(n: Int): Any

n-й элемент этого продукта, нумерация с 0. Другими словами, для продукта A(x1, ..., xk), возвращает x(n+1), где 0 <= n < k.

Параметры
n

индекс возвращаемого элемента

Возвращает

элемент n элементов после первого элемента

Исключения
IndexOutOfBoundsException

если n выходит за пределы диапазона (n < 0 || n >= productArity).

Унаследовано от Product

Исходный код
def productElementName(n: Int): String

Имя n-го элемента этого продукта, нумерация с 0. В реализации по умолчанию – пустая строка.

Параметры
n

индекс искомого имени элемента

Возвращает

имя указанного элемента

Исключения
IndexOutOfBoundsException

если n выходит за пределы диапазона (n < 0 || n >= productArity).

Унаследовано от Product

Исходный код
def productElementNames: Iterator[String]

Итератор по именам всех элементов этого продукта.

Унаследовано от Product

Исходный код
def productIterator: Iterator[Any]

Итератор по всем элементам этого продукта.

Возвращает

в реализации по умолчанию, итератор Iterator[Any]

Унаследовано от Product

Исходный код
def productPrefix: String

Строка, используемая в методах toString производных классов. Реализации могут переопределить этот метод, чтобы добавить строковый префикс к результату методов toString.

Возвращает

в реализации по умолчанию, пустая строка

Унаследовано от Product

© 2002-2022 EPFL, with contributions from Lightbend.
Licensed under the Apache License, Version 2.0.
https://scala-lang.org/api/3.1.1/scala/util/Try.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API