消耗失敗的未來

有時,Future 中的計算會產生異常,這會導致 Future 失敗。在建立未來示例中,如果呼叫程式碼將 550 傳遞給 divide 方法怎麼辦?當然,在嘗試除以零之後,它會丟擲一個 ArithmeticException。如何處理消費程式碼?實際上有一些方法可以解決失敗問題。

使用 recover 和模式匹配處理異常。

object Calculator {
    def calculateAndReport(a: Int, b: Int) = {
        val eventualQuotient = FutureDivider divide(a, b)
    
        eventualQuotient recover {
            case ex: ArithmeticException => println(s"It failed with: ${ex.getMessage}")
        }
    }
}

使用 failed 投影處理異常,異常成為 Future 的值:

object Calculator {
    def calculateAndReport(a: Int, b: Int) = {
        val eventualQuotient = FutureDivider divide(a, b)
    
        // Note the use of the dot operator to get the failed projection and map it.
        eventualQuotient.failed.map {
            ex => println(s"It failed with: ${ex.getMessage}")
        }
    }
}