2015-07-07 11 views
0

Возможно ли исключение для исключения, избегая контекста Future?Исключение Прохождение через scala.concurrent.Future?

Поскольку Future «оценивает», как только он определен:

возможно для определения Future бросить исключение, проходя через Future контексте?

scala> Future { Thread.sleep(3000); println("3 seconds elapsed"); 100 } 
res2: scala.concurrent.Future[Int] = 
    [email protected] 

scala> 3 seconds elapsed 

Я не мог придумать такой пример.

scala> Future { throw new Exception("Foo!") } 
res3: scala.concurrent.Future[Nothing] = 
    [email protected] 

ответ

3

Да, но, возможно, не совсем так, как вы думаете. Согласно source, только ошибки неNonFatal сбегут Future.apply.

try Success(body) catch { case NonFatal(e) => Failure(e) } 

то есть исключения, как: VirtualMachineError, OutOfMemoryError, StackOverflowError, ThreadDeath, LinkageError, InterruptedException, ControlThrowable .. будут идти неперехваченными как они представляют собой фатальную ошибку виртуальной машины Java, что вы не сможете справиться.

+0

StackOverflowError на самом деле считается нефатальным по какой-то причине – dwickern

+0

Скаладоки говорят иначе: http://www.scala-lang.org/api/current/#scala.util.control.NonFatal$ Возможно, они неправильны? –

+0

Я запустил этот REPL за то, что @dwickern сказал: 'scala> try {throw new StackOverflowError (" ... ")} catch {case NonFatal (e) =>" caught it "} java.lang.StackOverflowError: .. . at .liftedTree1 $ 1 (: 12) ... 33 elided' –

0

Будущее само по себе ничего не делает, кроме определения вычисления. Просто так получается, что вы используете один из конструкторов (или применяете методы), который по умолчанию сразу запускает вычисление. Смешение обработки исключений и параллелизма является одной из проблем, которые, к сожалению, не явны с помощью scala.concurrent.Future. Лучшей альтернативой может быть использование scalaz.concurrent.Task, который сочетает обработку ошибок с явным параллелизмом.

0

Почему вы хотите исправить ошибки из вашего будущего?

Будущее - монада, которая будет обрабатывать задержки и исключения, пока вы имеете дело с ней.

Если вы посмотрите на реализацию будущего он выглядит, как показано ниже,

trait Future[T] { def onComplete(callback: Try[T] => Unit)(implicit exe..) } 

Так что, когда, как только ваше будущее получает полное и доступное значение ваш метод обратного вызова будет вызываться и возврата блока.

Если вы видите метод обратного вызова, вы получите представление о том, что ваш результат будет успешным или будет ошибкой, и попробуйте [T] woluld управлять всеми вещами для вас.

+0

Я не хочу бросать исключение из Будущего. Я хочу знать, возможно ли это. –

Смежные вопросы