Почему Future (Failure (new Exception)) возвращает Success вместо ошибки? - PullRequest
3 голосов
/ 13 июля 2020

Я пробовал следующее и думал, что получу ошибку

val failure = Future { Failure(new Exception) }

но вместо этого получил

Future(Success(Failure(java.lang.Exception)))

Кто-нибудь может ответить, почему?

1 Ответ

5 голосов
/ 13 июля 2020

Future.failed может создать неудачное будущее, например

Future.failed(new Exception)

или throw внутри будущего

Future(throw new Exception)

или позвонить Future.fromTry

Future.fromTry(Failure(new Exception))

однако

Future(Failure(new Exception))

не представляет собой неудачное будущее, потому что

Failure(new Exception)

- это, несмотря на возможно вводящие в заблуждение имена, просто обычное значение, например

val x = Failure(new Exception)
val y = 42
Future(x)
Future(y)

, поэтому Future(x) - это успешное будущее по той же причине, Future(y) - успешное будущее.

Вы можете думать о Future как о своего рода asyn c try-catch, поэтому, если вы не бросаете внутри try

try {
  Failure(new Exception) // this is not a throw expression
} catch {
  case exception =>      // so exception handler does not get executed
}

, обработчик catch не выполняется.

...