處理來自期貨的錯誤

exceptionFuture 中丟擲時,你可以(應該)使用 recover 來處理它。

例如,

def runFuture: Future = Future { throw new FairlyStupidException }

val itWillBeAwesome: Future = runFuture

……將從 Future 中丟擲一個 Exception。但是看到我們能夠以高概率預測 FairlyStupidException 型別的 Exception,我們可以優雅地處理這個案例:

val itWillBeAwesomeOrIllRecover = runFuture recover { 
    case stupid: FairlyStupidException => 
         BadRequest("Another stupid exception!") 
}

正如你所看到的,recover 的方法是所有 Throwable 的領域,所以你可以只處理幾種型別,然後讓其餘型別進入 Future 堆疊中更高階別的異常處理。

請注意,這類似於在非 Future 上下文中執行以下程式碼:

def runNotFuture: Unit = throw new FairlyStupidException

try {
    runNotFuture
} catch {
    case e: FairlyStupidException => BadRequest("Another stupid exception!")
}

處理 Futures 中產生的異常非常重要,因為大部分時間它們都更隱蔽。它們通常不會全部通過,因為它們在不同的執行上下文和執行緒中執行,因此在它們發生時不會提示你修復它們,特別是如果你沒有注意到日誌中的任何內容或者應用。