2017-04-12 57 views
1

正在处理的异常为什么下面的代码仍然抛出,即使它正在被onFailure处办理斯卡拉未来投掷即使它是失败的的onComplete

val f: Future[Int] = Future { 
    Thread.sleep(10) 
    1/0 
    1 
} 

f.onComplete { 
    case Success(value) => println(value) 
    case Failure(ex)=> println(ex) 
} 

Await.result(f, Duration.Inf) // throws an Arithmetic exception 
+0

使用'recover'。 'onComplete'只是作为执行结果执行的exta回调。 – Rumoku

回答

2

因为onComplete被注册为回调异常未来,它不会改变它或创造一个新的未来。这意味着你有效地等待将来抛出异常。

你想用recover/recoverWith

val f: Future[Int] = Future { 
    Thread.sleep(10) 
    1/0 
    1 
} 

val recovered: Future[Int] = f.recover { case e: ArithmeticException => 0 } 
Await.result(recovered, Duration.Inf) 
+0

感谢v多..它的工作..这是否意味着恢复改变将来能够处理异常? – Stanley

+0

@Stanley是的,如果你看一下recover'的'签名:'DEF恢复[U>:T](PF:PartialFunction [Throwable的,U])(隐式执行:执行上下文):未来[U]',你看它会产生一个新的未来,希望能够处理在以前的未来发生的任何异常,并返回新的未来。 –

+0

好的感谢您的解释 – Stanley