Почему Future(Failure(new Exception)) возвращает успех, а не отказ?

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

val failure = Future { Failure(new Exception) }

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

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

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


person Muskan Gupta    schedule 13.07.2020    source источник
comment
Вы можете проверить, что тип failure что-то вроде Future[Try[Nothing]], поэтому это будущее попытки, в данном случае — успешное будущее неудачной попытки. Обратите внимание, что будущее попытки редко имеет смысл.   -  person Luis Miguel Mejía Suárez    schedule 13.07.2020


Ответы (1)


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 как о своего рода асинхронном try-catch, поэтому, если вы не бросаете внутри try

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

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

person Mario Galic    schedule 13.07.2020