2014-06-11 31 views
3

我在斯卡拉初學者,我有一個問題,異常處理階,異常處理,承諾

代碼

val f = future { throw new Exception } 
val p = promise[Int] 
p completeWith f 
p.future onFailure { 
    case t => println("An error has occured: " + t) 
} 
p.future onSuccess { 
    case x => println(x) 
} 
Await.result(f, 10 seconds) 

,結果我得到的字符串出現了一個錯誤:java.lang中。異常,但後面跟着異常並終止程序。

這個程序有什麼問題?

回答

5

Await.result是一個非常鈍的工具。如果未來失敗,它只會拋出異常。你可以跳過第一個和最後一個之間的所有行,你會得到相同的結果。

此外,onFailure不提供錯誤處理,正確理解 - 這只是一種方式,如果將來發生故障發生的事情。要真正處理錯誤,使用recoverrecoverWith(請注意,我用Future代替future,現在已不建議):

val f = Future { throw new Exception } 

val r = f.recover { 
    case t => println("An error has occured: " + t); 13 // some default value 
} 

現在,您可以阻止和等待rAwait.result(r, 10.seconds)

-1

等待會在主線程中再次引發異常。

如果你讓

try { 
    Await.result(f, 10 seconds) 
} 
catch { 
    case a => prinln("here") 
} 

你的代碼( 「這裏」)行執行的println。

+0

對不起,但第一部分正是我所說的,第二部分是處理失敗的未來的一種極其複雜的方式。 –