處理來自期貨的錯誤
當 exception
從 Future
中丟擲時,你可以(應該)使用 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!")
}
處理 Future
s 中產生的異常非常重要,因為大部分時間它們都更隱蔽。它們通常不會全部通過,因為它們在不同的執行上下文和執行緒中執行,因此在它們發生時不會提示你修復它們,特別是如果你沒有注意到日誌中的任何內容或者應用。