2016-11-25 30 views
0

當我運行下面的代碼它終止並沒有任何反應,有沒有辦法趕上future2.map異常?Can a Future可以拋出一個由調用者捕獲的異常嗎?

object TestFutures1 { 
    val future1 = Future { 
    throw new Exception("error") 
    } 
} 

object TestFutures2 extends App { 
    val future2 = TestFutures1.future1 
    future2.map { result => println(result) } 
    Thread.sleep(5000) 
} 

回答

3

一般來說,有兩個選項(有一些子選項)來處理未來的異常。

  1. 您可以添加一個回調,當未來的異常完成,將被稱爲:

    future2 
        .map { result => println(result) } 
        .onFailure { exc => 
        exc.printStackTrace 
        } 
    

1A。 .onFailure僅用於副作用,例如,不能用於處理異常。如果你想處理和拯救未來,你可以使用.recover.recoverWith(兩者之間唯一的區別是後者採用返回Future的函數,而前者處理實際結果,與map相同的想法與。flatMap

future2 
     .map(println) 
     .recover { case e => 
     e.printStackTrace 
     "recovered" 
     }.map(println) 
  • 另一種選擇是等待將來完成,並獲得它的結果:

    try { 
        // Instead of Thread.sleep - you don't need that: 
        Await.result(future2, 2 seconds) 
    } catch { case exc => 
        exc.printStackTrace 
    } 
    
  • 2

    除了@迪瑪的回答,也可以使用onComplete來捕捉失敗,如:

    val re = future2.map { result => println(result) } 
        re onComplete { 
        case Success(s) => ... 
        case Failure(e) => e.printStackTrace() 
        } 
    
    相關問題