Класс scala.util.Try
Тип 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.
| Наследники | |
|---|---|
| Известные подтипы |
Классы
Исходный код
final class WithFilter(p: T => Boolean)
Нам нужен целый класс WithFilter, чтобы соблюсти контракт «не создаёт новую коллекцию», хотя в коллекции с максимальным размером 1 это, похоже, вряд ли будет иметь значение.
Абстрактные методы
Исходный код
Применяет заданную частичную функцию к значению из этого Success или возвращает это значение, если это Failure.
Исходный код
Инвертирует этот Try. Если это Failure, возвращает его исключение, упакованное в Success. Если это Success, возвращает Failure, содержащую UnsupportedOperationException.
Исходный код
Преобразует это в Failure, если предикат не выполнен.
Исходный код
Возвращает заданную функцию, применённую к значению из этого Success или возвращает это значение, если это Failure.
Исходный код
Преобразует вложенный Try, т.е. Try типа Try[Try[T]], в неуложенный Try, т.е. Try типа Try[T].
Исходный код
Применяет fa, если это Failure, или fb, если это Success. Если fb изначально применяется и выбросит исключение, то fa применяется с этим исключением.
| Параметры значения |
|
|---|---|
| Возвращает | результаты применения функции |
| Пример |
val result: Try[Int] = Try { string.toInt }
log(result.fold(
ex => "Operation failed with " + ex,
v => "Operation produced value: " + v
))
|
Исходный код
Применяет заданную функцию f если это Success, в противном случае возвращает Unit, если это Failure.
Примечание: Если f выбросит исключение, то этот метод может выбросить исключение.
Исходный код
def get: T
Возвращает значение из этого Success или выбрасывает исключение, если это Failure.
Исходный код
def getOrElse[U >: T](default: => U): U
Возвращает значение из этого Success или заданный аргумент default, если это Failure.
Примечание:: Это выбросит исключение, если это не успех, а default выбросит исключение.
Исходный код
Возвращает true, если Try является Failure, false в противном случае.
Исходный код
Возвращает true, если Try является Success, false в противном случае.
Исходный код
Применяет заданную функцию к значению из этого Success или возвращает это значение, если это Failure.
Исходный код
Возвращает этот Try если это Success или заданный аргумент default если это Failure.
Исходный код
Применяет заданную функцию f если это Failure, в противном случае возвращает это значение, если это Success. Это как map для исключения.
Исходный код
Применяет заданную функцию f если это Failure, в противном случае возвращает это значение, если это Success. Это как flatMap для исключения.
Исходный код
Возвращает Left с Throwable, если это Failure, в противном случае возвращает Right со значением Success.
Исходный код
Возвращает None если это Failure или Some содержащее значение, если это Success.
Исходный код
Завершает эту Try путём применения функции f к этому значению, если оно имеет тип Failure, или, наоборот, путём применения s если это Success.
Конкретные методы
Исходный код@inline
Создаёт нестрогий фильтр, который в конечном итоге преобразует это в Failure если предикат не удовлетворён.
Примечание: в отличие от filter, withFilter не создаёт новую Try. Вместо этого он ограничивает область применения последующих map, flatMap, foreach, и withFilter операций.
Поскольку Try является коллекцией из одного элемента, это может быть немного излишне, но это согласуется с withFilter для Option и другими коллекциями.
| Параметры |
|
|---|---|
| Возвращает | объект класса |
Наследованные методы
Исходный код
Метод, который должен вызываться из каждого хорошо спроектированного метода equals, который может быть переопределён в подклассе. См. Programming in Scala, глава 28 для обсуждения и проектирования.
| Параметры |
|
|---|---|
| Возвращает | true, если эта инстанция может быть равна |
| Унаследовано от | Equals |
Исходный код
def productArity: Int
Размер этого продукта.
| Возвращает | для продукта |
|---|---|
| Унаследовано от | Product |
Исходный код
n-й элемент этого продукта, нумерация с 0. Другими словами, для продукта A(x1, ..., xk), возвращает x(n+1), где 0 <= n < k.
| Параметры |
|
|---|---|
| Возвращает | элемент |
| Исключения |
|
| Унаследовано от | Product |
Исходный код
Имя n-го элемента этого продукта, нумерация с 0. В реализации по умолчанию – пустая строка.
| Параметры |
|
|---|---|
| Возвращает | имя указанного элемента |
| Исключения |
|
| Унаследовано от | Product |
Исходный код
Итератор по именам всех элементов этого продукта.
| Унаследовано от | Product |
|---|
Исходный код
Итератор по всем элементам этого продукта.
| Возвращает | в реализации по умолчанию, итератор |
|---|---|
| Унаследовано от | 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