Класс Try.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 будут перехватывать исключения и возвращать failure, если не указано иное в документации.
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.
Конкретные методы
Исходный код
Создаёт нестрогий фильтр, который в конечном итоге преобразует это в Failure если предикат не удовлетворён.
Примечание: в отличие от filter, withFilter не создаёт новый Try. Вместо этого он ограничивает область действия последующих map, flatMap, foreach, и withFilter операций.
Поскольку Try является коллекцией из одного элемента, это может быть немного избыточно, но это согласуется с withFilter для Option и другими коллекциями.
| Параметры |
|
|---|---|
| Возвращает | объект класса |
Унаследованные методы
Исходный код
Метод, который должен вызываться из каждого хорошо спроектированного метода equals, который может быть переопределён в подклассе. См. Programming in Scala, Chapter 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.2.0/scala/util/Try.html