Первая функция testThrowException
не возвращает Future в случае, если она получает 0
в качестве ввода.Поэтому программа продолжает работать, пока не появится исключение.
Однако, как видно из исходного кода, вставленного ниже, Future.map
всегда возвращает другое будущее:
def map[S](f: T => S)(implicit executor: ExecutionContext): Future[S] = { // transform(f, identity)
val p = Promise[S]()
onComplete { v => p complete (v map f) }
p.future
}
Простое определение будущего не распечатывает его результаты, а также невывести исключения.Для этого вам нужно определить onSuccess
, onFailure
или onComplete
.Однако, если оператор print существует в теле Future, он выполнит:
def addOne(number: Int): Int = {
if (number == 0) {
// you can also print the exception instead of just throwing it.
throw new Exception("number is 0")
} else {
println("success")
1 + number
}
}
Future { addOne(1) } // scala.concurrent.Future[Int] = Future(Success(2))
// the above also prints "success"
Future { addOne(0) } // scala.concurrent.Future[Int] = Future(Failure(java.lang.Exception: number is 0))
// the above does not print anything unless the exception is printed before thrown in `addOne`
Вы также можете использовать onComplete
, чтобы обработать как успех, так и / или неудачу:
// prints "got error" plus the stack trace
- List item
Future {0}.map(addOne).onComplete {
case Success(value) => println(s"got $value")
case Failure(t) => println("got error: " + t.getStackTrace.mkString("\n"))
}
Обратите внимание, что использовался импорт:
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Failure, Success}